[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}

그러나 나는 그것보다 더 자동적 인 것을 원합니다.

파이썬은이 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을 생성하기 위해 노력하는 foobar, 그것은 훨씬 더 파이썬은 문자열의 밖으로 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
>>|