我在python中编程,需要访问我给对象的名称,以便能够将其作为字符串传递(与另一个字符串连接).
我需要这样做的原因是我使用的程序强制我创建一个全局(在我的情况下是一个字典),我正在编写一个函数来处理几个不同的对象(每个对象都有类似的集合)属性,例如,对象1的长度为2(在我的情况下表示2个神经元)标记为0和1,并且每个属性都有4个属性a,b,c,d.我想创建这些属性的"字典文件树"但是object1和object 2都是同一个类的2个实例,因此我需要将第一级键更改为'NAME1_0,'NAME1_1','NAME2_0','NAME2_1').
def Init(neuron,input):
#Initialises the neuron group, arguements are neuron (neurongroup) and input (neurongroup)
global dict
dict={}
for x in range(0,len(neuron)):
neuron[x].L=0
neuron[x].G=0
neuron[x].ron=1/period
neuron[x].roff=1/period
dict[x]={'tau_on':0.5,
'Non_off':neuron[x].roff*0.5,
'Non_off':neuron[x].ron*0.5,
'Ni_on':ones(len(input))*qon*0.5,
'Ni':ones(len(input))*qoff*0.5+ones(len(input))*qon*0.5,
'p_current':0,
'p_previous':0,
'my_tau_on':[],
'my_Non_off':[],
'my_Noff_on':[],
'my_Ni_on':[],
'my_Ni':[],
'my_p_on':[],
'my_ron':[],
'my_roff':[],
'my_theta':[],
'my_weights':[],
'my_record_times':[]}
dict['%s' % x, neuron]=dict.pop(x)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它不给分配给对象的名称,而只是给对象本身的名称.对于我的问题的一个更小的情况
NAME1=4
def func(x): #creates string of 'NAME1'
print 'x'
func(NAME1)
#output='NAME1'
Run Code Online (Sandbox Code Playgroud)
你可以在globals()中反向查找名称:
>>> NAME1 = 4
>>> def name_of(value):
for k, v in globals().items():
if v is value:
return k
raise KeyError('did not find a name for %s' % value)
>>> name_of(NAME1)
'NAME1'
Run Code Online (Sandbox Code Playgroud)
如果已将同一对象分配给多个名称,则只返回一个名称.
如果你想要更广泛地搜索全局,请查找dicts gc.get_referrers(value)并捕获所有匹配:
>>> def names_of(value):
'Find all names for the value'
result = []
for d in gc.get_referrers(value):
if isinstance(d, dict):
for k, v in d.items():
if v is value:
result.append(k)
return result
>>> import math
>>> pie = math.pi
>>> names_of(pie)
['pie', '_pi', 'pi', 'pi']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |