문제

이 질문은 이미 여기에 답이 있습니다.

변수 이름이 있다고 가정 해 봅시다 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 ()에 액세스 할 수있는 것을 가져올 필요가 없습니다.

또한 값에 대한 여러 별칭이있는 경우 네임 스페이스를 통해 반복하면 첫 번째 별칭 만 찾습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top