Как я могу получить доступ к имени данной переменной в Python? - PullRequest
3 голосов
/ 26 октября 2011

Я программирую на python и мне нужно получить доступ к имени, которое я дал объекту, чтобы иметь возможность передавать его как строку (объединенную с другой строкой).

Причина, по которой мне нужно это сделать, заключается в том, что программа, которую я использую, вынуждает меня создать глобал (который в моем случае является словарем), и я пишу функцию для работы в целом с несколькими различными объектами (каждый из которых имеет аналогичные наборы свойств, например, объект 1 имеет длину 2 (что в моем случае означает 2 нейрона) с метками 0 и 1, и у каждого из них есть 4 свойства a, b, c, d. Я хочу создать «словарь filetree» из эти свойства, но как object1, так и object 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)

не работает, так как не дает имя, присвоенное объекту, а просто имя самого объекта. для более минимального случая моей проблемы

NAME1=4
def func(x):    #creates string of 'NAME1'
    print 'x'

func(NAME1)
#output='NAME1'

1 Ответ

8 голосов
/ 26 октября 2011

Вы можете сделать обратный поиск имен в глобальных переменных ():

>>> 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'

Если один и тот же объект был назначен более чем одному имени, будет возвращено только одно имя.

Если вы хотите искать шире, чем просто глобальные переменные, ищите слова в 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...