변수의 이름을 문자열로 얻을 수 있기를 원하지만 파이썬에 많은 내성 기능이 있는지 모르겠습니다. 다음과 같은 것 :
>>> print(my_var.__name__)
'my_var'
변수가 많기 때문에 다음과 같은 사전으로 바꾸고 싶습니다.
bar = True
foo = False
>>> my_dict = dict(bar=bar, foo=foo)
>>> print my_dict
{'foo': False, 'bar': True}
그러나 나는 그것보다 더 자동적 인 것을 원합니다.
파이썬은이 locals()
와 vars()
나는 방법이 생각 때문에.
답변
이 작업을 시도하고 있습니까?
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}
답변
unwind가 말했듯이, 이것은 실제로 파이썬에서하는 것이 아닙니다. 변수는 실제로 객체에 대한 이름 매핑입니다.
그러나 시도하고 수행하는 한 가지 방법이 있습니다.
>>> 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'
답변
나는 이것을 꽤 많이하고 싶었다. 이 핵은 rlotun의 제안과 매우 유사하지만 하나의 라이너로 나에게 중요합니다.
blah = 1
blah_name = [ k for k,v in locals().iteritems() if v is blah][0]
파이썬 3+
blah = 1
blah_name = [ k for k,v in locals().items() if v is blah][0]
답변
이것은 해킹입니다. 모든 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)
(2 줄에 make_dict를 호출하면) 작동하지 않습니다.
대신의 DICT을 생성하기 위해 노력하는 값 foo
과 bar
, 그것은 훨씬 더 파이썬은 문자열의 밖으로 DICT 생성하는 것이다 변수 이름 'foo'
과 'bar'
:
dict([(name,locals()[name]) for name in ('foo','bar')])
답변
실제로는 “변수”가없는 파이썬에서는 불가능합니다. Python에는 이름이 있으며 동일한 객체에 대해 둘 이상의 이름이있을 수 있습니다.
답변
내 문제가이 질문이 왜 유용한 지 설명하는 데 도움이 될 것이며, 답변하는 방법에 대해 조금 더 통찰력을 줄 수도 있습니다. 내 코드의 다양한 변수에 대해 빠른 인라인 헤드 검사를 수행하는 작은 함수를 작성했습니다. 기본적으로 변수 이름, 데이터 유형, 크기 및 기타 속성이 나열되어 있으므로 실수를 신속하게 파악할 수 있습니다. 코드는 간단하다 :
def details(val):
vn = val.__name__ # If such a thing existed
vs = str(val)
print("The Value of "+ str(vn) + " is " + vs)
print("The data type of " + vn + " is " + str(type(val)))
따라서 복잡한 사전 / 목록 / 튜플 상황이있는 경우 통역사가 지정한 변수 이름을 반환하도록하는 것이 도움이됩니다. 예를 들어 다음은 이상한 사전입니다.
m = 'abracadabra'
mm=[]
for n in m:
mm.append(n)
mydic = {'first':(0,1,2,3,4,5,6),'second':mm,'third':np.arange(0.,10)}
details(mydic)
The Value of mydic is {'second': ['a', 'b', 'r', 'a', 'c', 'a', 'd', 'a', 'b', 'r', 'a'], 'third': array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]), 'first': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
The data type of mydic is <type 'dict'>
details(mydic['first'])
The Value of mydic['first'] is (0, 1, 2, 3, 4, 5, 6)]
The data type of mydic['first'] is <type 'list'>
details(mydic.keys())
The Value of mydic.keys() is ['second', 'third', 'first']
The data type of mydic.keys() is <type 'tuple'>
details(mydic['second'][0])
The Value of mydic['second'][0] is a
The data type of mydic['second'][0] is <type 'str'>
나는 이것을 올바른 장소에 넣었는지 확실하지 않지만 도움이 될 것이라고 생각했습니다. 나는 그것을 희망한다.
답변
이 질문에 대한 답을 바탕으로 깔끔하고 유용한 기능을 작성했습니다. 유용 할 수 있도록 여기에 넣겠습니다.
def what(obj, callingLocals=locals()):
"""
quick function to print name of input and value.
If not for the default-Valued callingLocals, the function would always
get the name as "obj", which is not what I want.
"""
for k, v in list(callingLocals.items()):
if v is obj:
name = k
print(name, "=", obj)
용법:
>> a = 4
>> what(a)
a = 4
>>|