Вопрос-Ответ

Simpler way to create dictionary of separate variables?

Более простой способ создать словарь отдельных переменных?

Я хотел бы иметь возможность получать имя переменной в виде строки, но я не знаю, обладает ли Python такими широкими возможностями самоанализа. Что-то вроде:

>>> print(my_var.__name__)
'my_var'

Я хочу это сделать, потому что у меня есть куча переменных, которые я хотел бы превратить в словарь, например :

bar = True
foo = False
>>> my_dict = dict(bar=bar, foo=foo)
>>> print my_dict
{'foo': False, 'bar': True}

Но я бы хотел что-то более автоматическое, чем это.

В Python есть locals() и vars(), так что, я думаю, способ есть.

Переведено автоматически
Ответ 1

Как сказал unwind , на самом деле это не то, что вы делаете в Python - переменные на самом деле являются сопоставлениями имен объектам.

Однако вот один из способов попробовать это сделать:

 >>> a = 1
>>> for k, v in list(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 in locals().iteritems() if v is blah][0]

Python 3+

blah = 1
blah_name = [ k for k,v in locals().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

def make_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(',')]
return dict(zip(text,expr))

bar=True
foo=False
print(make_dict(bar,foo))
# {'foo': False, 'bar': True}

Обратите внимание, что этот взлом хрупкий:

make_dict(bar,
foo)

(вызов make_dict в 2 строках) не сработает.

Вместо того, чтобы пытаться сгенерировать dict из значений foo и bar, было бы гораздо более питонически сгенерировать dict из строковых имен переменных 'foo' и 'bar':

dict([(name,locals()[name]) for name in ('foo','bar')])
2023-08-03 20:47 python string