[python] 변수 이름을 문자열로 얻기

이 스레드는 파이썬 에서 함수 이름을 문자열로 얻는 방법을 설명합니다 :
함수 이름을 문자열로 얻는 방법?

변수에 대해 어떻게 똑같이 할 수 있습니까? 함수와 달리 파이썬 변수에는 __name__속성 이 없습니다 .

즉, 다음과 같은 변수가있는 경우 :

foo = dict()
foo['bar'] = 2

retrieve_name()들어이 목록에서 Pandas에서 DataFrame만들려면 함수 / 속성을 찾고 있습니다. 여기서 열 이름 은 실제 사전의 이름으로 지정됩니다.

# List of dictionaries for my DataFrame
list_of_dicts = [n_jobs, users, queues, priorities]
columns = [retrieve_name(d) for d in list_of_dicts] 



답변

python-varname패키지를 사용하면 변수 이름을 쉽게 검색 할 수 있습니다

https://github.com/pwwang/python-varname

귀하의 경우 다음을 수행 할 수 있습니다.

from varname import Wrapper

foo = Wrapper(dict())

# foo.name == 'foo'
# foo.value == {}
foo.value['bar'] = 2

또는 변수 이름을 직접 검색 할 수도 있습니다.

from varname import nameof

foo = dict()

fooname = nameof(foo)
# fooname == 'foo'

이 패키지의 저자입니다. 질문이 있거나 github에 문제를 제출할 수 있으면 알려주십시오.


답변

정식 이름을 가진 파이썬의 유일한 객체는 모듈, 함수 및 클래스이며, 물론이 정식 이름은 함수 나 클래스가 정의되거나 모듈을 가져온 후에 네임 스페이스에서 의미가 있다고 보장 할 수 없습니다. 이러한 이름은 개체를 만든 후에도 수정할 수 있으므로 항상 신뢰할 수있는 것은 아닙니다.

당신이하고 싶은 것은 재귀 적으로 명명 된 객체의 나무를 걷지 않으면 불가능 합니다 . 이름은 객체에 대한 단방향 참조입니다. 일반적이거나 정원이 다양한 Python 객체에는 이름에 대한 참조가 없습니다. 모든 정수, 모든 dict, 모든 목록, 모든 Boolean이 그것을 참조하는 이름을 나타내는 문자열 목록을 유지해야한다고 상상해보십시오! 프로그래머에게는 거의 도움이되지 않는 구현 악몽이 될 것입니다.


답변

변수 값이 이름을 다시 가리 키지 않더라도 할당 된 모든 변수 목록과 해당 값에 액세스 할 수 있으므로 한 사람 만 var 이름을 찾기 위해 루핑을 제안한 것이 놀랍습니다.

그 대답에 대해 누군가가 스택을 걷고 모든 지역 및 전역을 찾아서 찾아야 할 수도 있다고 언급 foo했지만, fooretrieve_name함수를 호출하는 범위에 할당 된 경우 inspect‘s current frame를 사용 하여 해당 지역 변수를 모두 얻을 수 있습니다 .

내 설명은 약간 말이 많을 수도 있지만 (단어 “foo”보다 적은 단어를 사용해야했을 수도 있음) 코드 는 다음과 같습니다 (동일한 값에 둘 이상의 변수가 할당되어 있으면 변수 이름을 모두 얻습니다 ).

import inspect

x,y,z = 1,2,3

def retrieve_name(var):
    callers_local_vars = inspect.currentframe().f_back.f_locals.items()
    return [var_name for var_name, var_val in callers_local_vars if var_val is var]

print retrieve_name(y)

다른 함수에서이 함수를 호출하는 경우 다음과 같습니다.

def foo(bar):
    return retrieve_name(bar)

foo(baz)

그리고 당신은 원하는 baz대신 bar, 당신은 단지 더 범위를 다시 이동해야합니다. 이것은 여분을 추가하여 수행 할 수 있습니다 .f_backcaller_local_vars초기화.

여기 예를보십시오 : ideone


답변

Python 3.8에서는 간단히 f-string 디버깅 기능을 사용할 수 있습니다.

>>> foo = dict()
>>> f'{foo=}'.split('=')[0]
'foo' 


답변

python3 에서이 함수는 스택에서 가장 외부 이름을 얻습니다.

import inspect


def retrieve_name(var):
        """
        Gets the name of var. Does it from the out most frame inner-wards.
        :param var: variable to get name from.
        :return: string
        """
        for fi in reversed(inspect.stack()):
            names = [var_name for var_name, var_val in fi.frame.f_locals.items() if var_val is var]
            if len(names) > 0:
                return names[0]

코드의 어느 곳에서나 유용합니다. 첫 번째 일치 항목을 찾은 역 스택을 트래버스합니다.


답변

나는 이것이 가능하다고 생각하지 않습니다. 다음 예제를 고려하십시오.

>>> a = []
>>> b = a
>>> id(a)
140031712435664
>>> id(b)
140031712435664

ab같은 객체를 가리키고 있지만, 객체가 가리키는 파일 변수를 알 수 없다.


답변

def name(**variables):
    return [x for x in variables]

다음과 같이 사용됩니다.

name(variable=variable)