Simpler way to create dictionary of separate variables?
Более простой способ создать словарь отдельных переменных?
Я хотел бы иметь возможность получать имя переменной в виде строки, но я не знаю, обладает ли Python такими широкими возможностями самоанализа. Что-то вроде:
>>> print(my_var.__name__) 'my_var'
Я хочу это сделать, потому что у меня есть куча переменных, которые я хотел бы превратить в словарь, например :
Но я бы хотел что-то более автоматическое, чем это.
В Python есть locals() и vars(), так что, я думаю, способ есть.
Переведено автоматически
Ответ 1
Как сказал unwind , на самом деле это не то, что вы делаете в Python - переменные на самом деле являются сопоставлениями имен объектам.
Однако вот один из способов попробовать это сделать:
>>> a = 1 >>> for k, v inlist(locals().iteritems()): if v is a: a_as_str = k >>> a_as_str a >>> type(a_as_str) 'str'
Ответ 2
Я давно хотел это сделать. Этот взлом очень похож на предложение rlotun, но он однострочный, что для меня важно:
blah = 1 blah_name = [ k for k,v inlocals().iteritems() if v is blah][0]
Python 3+
blah = 1 blah_name = [ k for k,v inlocals().items() if v is blah][0]
Ответ 3
Вы пытаетесь это сделать?
dict( (name,eval(name)) for name in ['some','list','of','vars'] )
Пример
>>> some= 1 >>> list= 2 >>> of= 3 >>> vars= 4 >>> dict( (name,eval(name)) for name in ['some','list','of','vars'] ) {'list': 2, 'some': 1, 'vars': 4, 'of': 3}
Ответ 4
Это взлом. Он не будет работать во всех дистрибутивах реализаций Python (в частности, в тех, которые не имеют traceback.extract_stack.)
import traceback
defmake_dict(*expr): (filename,line_number,function_name,text)=traceback.extract_stack()[-2] begin=text.find('make_dict(')+len('make_dict(') end=text.find(')',begin) text=[name.strip() for name in text[begin:end].split(',')] returndict(zip(text,expr))
Вместо того, чтобы пытаться сгенерировать dict из значенийfoo и bar, было бы гораздо более питонически сгенерировать dict из строковых имен переменных'foo' и 'bar':
dict([(name,locals()[name]) for name in ('foo','bar')])