파이썬에서 변수 이름을 어떻게 인쇄 할 수 있습니까? [복제하다
-
09-09-2019 - |
문제
이 질문은 이미 여기에 답이 있습니다.
변수 이름이 있다고 가정 해 봅시다 choice
변수의 이름에 어떻게 액세스 할 수 있습니까? 와 동등한 것
In [53]: namestr(choice)
Out[53]: 'choice'
사전 제작에 사용됩니다. 이것을하는 좋은 방법이 있고 나는 그것을 놓치고 있습니다.
편집하다:
이를 수행 해야하는 이유는입니다. 런타임에 조정하거나 조정하지 않는 여러 매개 변수로 프로그램을 호출하는 데이터 분석 작업을 실행 중입니다. 나는 다음과 같이 형성된 .config 파일에서 마지막 실행에 사용한 매개 변수를 읽었습니다.
filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
값을 제기 할 때 이전에 사용 된 것이 표시되고 빈 문자열 입력은 이전에 사용 된 값을 사용합니다.
내 질문은 이러한 값을 스캔 한 사전을 작성할 때 발생하기 때문에 발생합니다. 매개 변수가 필요한 경우 실행합니다 get_param
파일에 액세스하고 매개 변수를 찾습니다.
나는 그것을 읽음으로써 문제를 모두 피할 것이라고 생각합니다.config
한 번 파일을 파일하고 사전을 생성하십시오. 나는 더 이상 기억하지 못하는 이유 때문에 원래 그것을 피했다. 내 코드를 업데이트하기에 완벽한 상황!
해결책
당신이 주장한다면, 여기에 끔찍한 검사 기반 솔루션이 있습니다.
import inspect, re
def varname(p):
for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
m = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)', line)
if m:
return m.group(1)
if __name__ == '__main__':
spam = 42
print varname(spam)
나는 그것이 당신이 가진 문제를 재평가하고 다른 접근법을 찾도록 영감을주기를 바랍니다.
다른 팁
원래 질문에 답하기 위해 :
def namestr(obj, namespace):
return [name for name in namespace if namespace[name] is obj]
예시:
>>> a = 'some var'
>>> namestr(a, globals())
['a']
처럼 @rbright가 이미 지적했습니다 당신이 무엇을 하든지 더 좋은 방법이있을 것입니다.
파이썬에는 변수가없고 이름 만 있기 때문에 할 수 없습니다.
예를 들어:
> a = [1,2,3]
> b = a
> a is b
True
이 두 가지 중 어느 것이 올바른 변수입니까? 사이에는 차이가 없습니다 a
그리고 b
.
있었어요 비슷한 질문 전에.
당신이 이것을하려고한다면, 그것은 당신이 뭔가 잘못하고 있다는 것을 의미합니다. 사용을 고려하십시오 dict
대신에.
def show_val(vals, name):
print "Name:", name, "val:", vals[name]
vals = {'a': 1, 'b': 2}
show_val(vals, 'b')
산출:
Name: b val: 2
특정 솔루션에 대한 자세한 내용을 묻지 않고 직면 한 문제를 설명하는 것이 좋습니다. 더 나은 답변을 얻을 수 있다고 생각합니다. 나는 당신이하려는 모든 일을 할 수있는 더 좋은 방법이 있기 때문에 이것을 말합니다. 이러한 방식으로 변수 이름에 액세스하는 것이 일반적으로 모든 언어로 문제를 해결할 필요는 없습니다.
즉, 모든 변수 이름은 이미 내장 기능을 통해 액세스 할 수있는 사전에 있습니다. 현지인 그리고 글로벌. 검사하는 범위에 올바른 것을 사용하십시오.
이 사전을 검사하기위한 몇 안되는 일반적인 관용구 중 하나는 쉬운 문자열 보간을위한 것입니다.
>>> first = 'John'
>>> last = 'Doe'
>>> print '%(first)s %(last)s' % globals()
John Doe
이런 종류의 것은 변수를 이름으로 검사해야하더라도 대안보다 조금 더 읽기 쉬운 경향이 있습니다.
이와 같은 것이 당신을 위해 일할 것인가?
>>> def namestr(**kwargs):
... for k,v in kwargs.items():
... print "%s = %s" % (k, repr(v))
...
>>> namestr(a=1, b=2)
a = 1
b = 2
그리고 당신의 예에서 :
>>> choice = {'key': 24; 'data': None}
>>> namestr(choice=choice)
choice = {'data': None, 'key': 24}
>>> printvars(**globals())
__builtins__ = <module '__builtin__' (built-in)>
__name__ = '__main__'
__doc__ = None
namestr = <function namestr at 0xb7d8ec34>
choice = {'data': None, 'key': 24}
구성 매개 변수에서 읽는 방법에 대한 수정 된 질문은 시간과 노력과 사용을 저장하는 것이 좋습니다. configparser 또는 (내가 선호하는 도구) configobj.
그들은 필요한 모든 것을 할 수 있고 사용하기 쉽고 다른 사람은 이미 제대로 작동하는 방법에 대해 걱정했습니다!
열망하는 평가를 통해 변수는 본질적으로 볼 때마다 (역설)를 볼 때마다 값으로 바뀝니다. 즉, 파이썬에는 내장되어 있습니다 네임 스페이스. 예를 들어, locals ()는 함수 변수의 이름을 값에 맵핑하는 사전을 반환하고 Globals ()는 모듈에 대해 동일합니다. 따라서:
for name, value in globals().items():
if value is unknown_variable:
... do something with name
지역 주민 () 및 Globals ()에 액세스 할 수있는 것을 가져올 필요가 없습니다.
또한 값에 대한 여러 별칭이있는 경우 네임 스페이스를 통해 반복하면 첫 번째 별칭 만 찾습니다.