programing

변수 이름을 문자열로 가져오기

randomtip 2023. 1. 15. 12:57
반응형

변수 이름을 문자열로 가져오기

함수 이름을 문자열로 얻는 방법은 이미 읽었어요.

변수에 대해 어떻게 같은 작업을 수행할 수 있습니까?에는 Python이 .__name__여하하다

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

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

//속성속속속속 i i i)을 찾고 있습니다.retrieve_name() 목록에서 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 3.8에서는 f-string 디버깅 기능을 간단히 사용할 수 있습니다.

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

이 방법의 한 가지 단점은 다음과 같습니다.'foo' printed printed printed printed printed printed printed printed printed printed printed printed printed printed printed printed printed를 추가해야 합니다.f'{foo=}' .즉, 변수의 이름을 이미 알고 있어야 합니다..

>>> 'foo'

질문에 대한 답변에 적용할 수 있는 다른 답변은 여기를 참조하십시오.

변수 값이 이름을 다시 가리키지 않더라도 할당된 모든 변수와 값의 목록에 액세스할 수 있습니다. 따라서 단 한 사람만이 당신의 이름을 찾기 위해 루핑할 것을 제안했다는 사실에 놀랐습니다.

을 걸어하고, 「」를 찾을 필요가 하는 이 .foo, 단의 경우foo.retrieve_name기능을 할 수 있습니다.inspect의 »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)

당신은 and the고 the the the the the the the the the the...bazbar한 단계만 더 거슬러 올라가면 됩니다. 할 수 방법은 하나 더 해서 할 수 ..f_back caller_local_vars★★★★★★★★★★★★★★★★★★.

예를 들어 ideone을 참조해 주세요.

Python에서 표준 이름을 가진 개체는 모듈, 함수 및 클래스뿐입니다. 물론 함수 또는 클래스가 정의되거나 모듈이 Import된 후 이 표준 이름이 네임스페이스에서 어떠한 의미도 갖는다는 보장은 없습니다.이러한 이름은 오브젝트가 생성된 후 수정할 수 있으므로 항상 신뢰할 수 있는 것은 아닙니다.

이름이 지정된 객체의 트리를 반복적으로 이동하지 않으면 작업을 수행할 수 없습니다. 이름은 객체에 대한 단방향 참조입니다.일반 또는 정원 변수 Python 개체에는 이름에 대한 참조가 없습니다.모든 정수, 모든 dit, 모든 목록, 모든 부울이 자신을 참조하는 이름을 나타내는 문자열 목록을 유지하는데 필요하다고 상상해 보십시오.그것은 프로그래머에게 거의 이득이 없는 구현 악몽이 될 것이다.

TL;DR

하다를 사용하세요.Wrapper도우미:

from varname.helpers import Wrapper

foo = Wrapper(dict())

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

목록 이해 파트의 경우 다음을 수행할 수 있습니다.

n_jobs = Wrapper(<original_value>) 
users = Wrapper(<original_value>) 
queues = Wrapper(<original_value>) 
priorities = Wrapper(<original_value>) 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the <original_value> by d.value

제가 패키지 제작자입니다.Github에서 질문이나 이슈를 제출할 수 있는 것이 있으면 알려주세요.

긴 답변

그게 가능하기나 해?

한마디로 이야기할 수 없군요.

런타임에 변수명을 취득하고 있기 때문에 이전 프레임에 액세스하여 변수명을 취득할 수 있는 함수가 필요합니다.때문에 는 래래 a a 가 필요합니다.Wrapper 코드합니다.이전 프레임의 ST 노드에서 정확한 변수 이름을 가져옵니다.

소스코드', 'A'는를 항상 수 것은 또, 「ST」등)에 변경되는 .pytest의 »assert이치노하나의 간단한 예는 코드가 다음 경로를 통해 실행되는 것입니다.exec()바이트 코드로부터 정보를 취득할 수 있지만, 너무 많은 노력이 필요하고, 에러가 발생하기 쉽습니다.

어떻게 하는 거야?

먼저 변수가 주어지는 프레임을 식별해야 합니다.단순히 이전 프레임만 있는 것은 아닙니다.예를 들어 함수에 대한 다른 래퍼가 있을 수 있습니다.

from varname import varname

def func():
  return varname()

def wrapped():
  return func()

x = wrapped()

예에서는 안쪽에 있는 .wrapped에 박히다x = wrapped()알 수 된 죠.x... 수수frame ★★★★★★★★★★★★★★★★★」ignorevarname이러한 중간 프레임의 일부를 생략할 수 있습니다.「 README 」는, API 「README」입니다.

다음으로 AST 노드를 해석하여 변수 값(함수 호출)이 할당되어 있는 위치를 찾아야 합니다.그것은 항상 단순한 임무가 아니다. 복잡한 AST 노드가 를 들어, AST 노드입니다.x = [wrapped()]AST 트리를 통과하여 올바른 할당을 식별해야 합니다.

얼마나 믿을 수 있나요?

할당 노드를 식별하면 신뢰성이 높아집니다.

varname모두 패키지를 사용하여 노드를 찾습니다.검출을 실행하는 노드가 올바른 노드임을 확인합니다(이것도 참조).

pytest, ipython, macropy, birdseye, reticulate with R 등 다른 AST 매직이 적용되는 환경에서 부분적으로 작동합니다.이러한 환경에서는 실행도 varname도 100% 작동하지 않습니다.

그걸 하려면 패키지가 필요해요?

그래, 또 그래.

시나리오가 단순하다면 @juan Isaza 또는 @scohe001에 의해 제공되는 코드는 변수가 직접 이전 프레임에서 정의되고 AST 노드가 단순한 할당인 경우에 대처하기에 충분합니다.한 프레임만 뒤로 돌아가 정보를 가져오면 됩니다.

단, 시나리오가 복잡해지거나 다른 어플리케이션시나리오를 채택할 필요가 있는 경우는, 그것들을 처리하기 위해서 와 같은 패키지가 필요할 수 있습니다.이러한 시나리오에는 다음과 같은 것이 있습니다.

  1. 소스 코드를 사용할 수 없거나 AST 노드에 액세스할 수 없는 경우 보다 편리한 메시지 표시
  2. 중간 프레임을 건너뜁니다(다른 중간 프레임으로 래핑 또는 호출하는 함수를 제외합니다).
  3. 는, 빌트인 함수 또는 라이브러리의 콜을 자동적으로 무시합니다.를 들면, '먹다'와 같이요.x = str(func())
  4. 할당 왼쪽에 있는 여러 변수 이름 검색
  5. 기타.

그럼 어떻게 할까요?f-string

@Aivar Paalberg a @Aivar Paalberg 。을 사용법그러나 런타임에는 없습니다. 즉, 이 기능은foo이름을 출력하기 전에. ,가 있으면varname변수가 발생한다는 것을 알 필요는 없습니다.

from varname import varname

def func():
  return varname()

# In external uses
x = func() # 'x'
y = func() # 'y'

마침내.

python-varname할 수 뿐만 과 같은 것도 검출할 수 있습니다.

  • 을 직접하려면 , 「」를 사용합니다.nameof
  • "Detect the name" (다음 속성명)을 합니다.will
  • "/" 를 사용하여 된 인수 .argname

상세한 것에 대하여는, 메뉴얼을 참조해 주세요.

하지만 마지막으로 하고 싶은 말은 틈틈이 사용하지 않도록 하세요.

소스 노드를 사용할 수 있거나 AST 노드에 액세스할 수 있는 환경에서 클라이언트 코드가 실행되는지 확인할 수 없기 때문입니다.물론 소스 코드를 해석하고 환경을 식별하며 AST 노드를 검색하여 필요에 따라 평가하는 데 리소스가 필요합니다.

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

a ★★★★★★★★★★★★★★★★★」b동일한 객체를 가리키지만 객체는 어떤 변수가 해당 객체를 가리키는지 알 수 없습니다.

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

사용법은 다음과 같습니다.

name(variable=variable)
>> my_var = 5
>> my_var_name = [ k for k,v in locals().items() if v == my_var][0]
>> my_var_name 
'my_var'

myvar가 다른 변수를 가리킬 경우 오류가 발생할 경우 다음을 시도해 보십시오(@mherzog에서 제안).

 >> my_var = 5
>> my_var_name = [ k for k,v in locals().items() if v is my_var][0]
>> my_var_name 
'my_var'

locals() - 현재 스코프의 로컬 변수를 포함하는 사전을 반환합니다.이 사전을 통해 반복함으로써 정의된 변수와 동일한 값을 가진 키를 확인할 수 있으며, 키를 추출하기만 하면 문자열 형식의 변수 텍스트를 얻을 수 있습니다.

from (비트 변경 후) https://www.tutorialspoint.com/How-to-get-a-variable-name-as-a-string-in-Python 에서 참조해 주세요.

나는 이런 마법을 강하게 부리기 위해 패키지 마법을 썼다.다음과 같이 쓸 수 있습니다.

from sorcery import dict_of

columns = dict_of(n_jobs, users, queues, priorities)

데이터 프레임 컨스트럭터에게 전달합니다.이는 다음과 같습니다.

columns = dict(n_jobs=n_jobs, users=users, queues=queues, priorities=priorities)

여기 한 가지 방법이 있습니다.중요한 일에는 추천하지 않겠습니다. 깨지기 쉬우니까요.하지만 할 수 있어요.

기능을 해서 함수를 .inspect.그런 다음 소스 코드를 해석하여 가져올 변수 이름을 식별할 수 있습니다.를 들어, 여기에서는 '아까다', '아까다'라는 .autodict를 들어 져목, 져g, gg, eg, eg, eg,eg, eg, eg, eg, eg, gg:§:

x = 'foo'
y = 'bar'
d = autodict(x, y)
print d

제공 내용:

{'x': 'foo', 'y': 'bar'}

, 보다 낫습니다.locals() ★★★★★★★★★★★★★★★★★」globals()후자의 방법으로는 원하는 변수가 무엇인지 알 수 없기 때문입니다.

어쨌든, 코드는 다음과 같습니다.

def autodict(*args):
    get_rid_of = ['autodict(', ',', ')', '\n']
    calling_code = inspect.getouterframes(inspect.currentframe())[1][4][0]
    calling_code = calling_code[calling_code.index('autodict'):]
    for garbage in get_rid_of:
        calling_code = calling_code.replace(garbage, '')
    var_names, var_values = calling_code.split(), args
    dyn_dict = {var_name: var_value for var_name, var_value in
                zip(var_names, var_values)}
    return dyn_dict

액션은 다음과 같이 발생합니다.inspect.getouterframes는 코드 이 반환됩니다.이은 코드 에서 호출된 문자열입니다.autodict.

이런 종류의 마술의 명백한 단점은 소스 코드가 어떻게 구성되어 있는지에 대한 추측을 한다는 것입니다.그리고 물론 통역기 안에서 작동하면 전혀 작동하지 않습니다.

>>> locals()['foo']
{}
>>> globals()['foo']
{}

함수를 직접 작성하려면 로컬에 정의된 변수를 확인한 다음 글로벌을 확인할 수 있습니다.아무것도 발견되지 않은 경우 id()를 비교하여 변수가 메모리 내의 동일한 위치를 가리키는지 여부를 확인할 수 있습니다.

변수가 클래스에 있는 경우 className.dict.keys() 또는 vars(self)를 사용하여 변수가 정의되어 있는지 확인할 수 있습니다.

이 함수는 변수 이름과 값을 인쇄합니다.

import inspect

def print_this(var):
    callers_local_vars = inspect.currentframe().f_back.f_locals.items()
    print(str([k for k, v in callers_local_vars if v is var][0])+': '+str(var))
***Input & Function call:***
my_var = 10

print_this(my_var)

***Output**:*
my_var: 10

방법이 있는데, 가장 효율적이지는 않지만, 효과가 있어요! (그리고 그것은 어떤 멋진 모듈도 필요로 하지 않습니다.)

기본적으로 변수 ID글로벌() 변수 ID와 비교한 다음 일치 이름을 반환합니다.

def getVariableName(variable, globalVariables=globals().copy()):
    """ Get Variable Name as String by comparing its ID to globals() Variables' IDs

        args:
            variable(var): Variable to find name for (Obviously this variable has to exist)

        kwargs:
            globalVariables(dict): Copy of the globals() dict (Adding to Kwargs allows this function to work properly when imported from another .py)
    """
    for globalVariable in globalVariables:
        if id(variable) == id(globalVariables[globalVariable]): # If our Variable's ID matches this Global Variable's ID...
            return globalVariable # Return its name from the Globals() dict

Python의def ★★★★★★★★★★★★★★★★★」class키워드는 특정 이름을 정의하는 오브젝트(함수 또는 클래스)에 바인드합니다.마찬가지로 모듈에는 파일시스템 고유의 것으로 불리기 때문에 이름이 붙습니다.이 세 가지 경우 모두 문제의 개체에 "표준" 이름을 할당하는 명백한 방법이 있습니다.

그러나 다른 종류의 오브젝트에서는 이러한 표준 이름이 존재하지 않을 수 있습니다.예를 들어 목록의 요소를 고려합니다.목록 내의 요소는 개별적으로 이름이 지정되지 않으며 프로그램에서 이들을 참조하는 유일한 방법은 포함 목록의 목록 인덱스를 사용하는 것입니다.이러한 개체 목록이 함수에 전달되면 의미 있는 식별자를 값에 할당할 수 없습니다.

Python은 다음과 같은 이유로 할당 왼쪽에 있는 이름을 할당된 개체에 저장하지 않습니다.

  1. 충돌하는 여러 개체 중에서 어떤 이름이 "표준"인지 파악해야 합니다.
  2. 명시적 변수 이름에 할당되지 않은 개체는 의미가 없습니다.
  3. 매우 비효율적일 수 있지만
  4. 말 그대로 다른 어떤 언어도 그렇게 하지 않습니다.

예를 이 기능을 사용해서 해 놓은 입니다.lambda은 항상 '이름'이 .<lambda>(특정 기능명이 아닌).

가장 좋은 방법은 단순히 발신자에게 (옵션) 이름 목록을 전달하도록 요청하는 것입니다.「 」를 ,'...','...'는 너무 때문에 수 있습니다(예: " " " "와 같이).namedtuple고 하다.

Python에서 이것을 하는 것은 매우 어렵다고 생각합니다.사용하고 있는 변수의 이름을 결코 알 수 없다는 단순한 사실 때문입니다.예를 들어 다음과 같이 할 수 있습니다.

대신:

list_of_dicts = [n_jobs, users, queues, priorities]

dict_of_dicts = {"n_jobs" : n_jobs, "users" : users, "queues" : queues, "priorities" : priorities}

대부분의 답변은 하나의 변수 이름만 반환합니다.그러나 두 개 이상의 변수가 동일한 값을 갖는 경우 이 방법은 제대로 작동하지 않습니다.다음은 동일한 값을 가진 변수가 더 많을 경우 여러 결과를 반환하는 Amr Sharaki의 답변의 변형입니다.

def getVariableNames(variable):
    results = []
    globalVariables=globals().copy()
    for globalVariable in globalVariables:
        if id(variable) == id(globalVariables[globalVariable]):
            results.append(globalVariable)
    return results

a = 1
b = 1
getVariableNames(a)
# ['a', 'b']

입력 변수의 내용을 기반으로 이를 수행하는 또 다른 방법:

(입력 변수와 일치하는 첫 번째 변수의 이름을 반환합니다.그렇지 않으면 [None]가 반환됩니다.입력변수와 같은 내용을 가진 변수명을 모두 취득하도록 수정할 수 있습니다.)

def retrieve_name(x, Vars=vars()):
    for k in Vars:
        if isinstance(x, type(Vars[k])):
            if x is Vars[k]:
                return k
    return None

변수를 추적하는 데 도움이 되는 경우 변수에 레이블을 지정하고 값과 유형을 반환하는 간단한 함수를 작성할 수 있습니다.예를 들어 i_f=3.01에서 코드에 사용할 i_n이라는 정수로 반올림한 다음 보고서에 들어갈 문자열 i_s가 필요하다고 가정합니다.

def whatis(string, x):
    print(string+' value=',repr(x),type(x))
    return string+' value='+repr(x)+repr(type(x))
i_f=3.01
i_n=int(i_f)
i_s=str(i_n)
i_l=[i_f, i_n, i_s]
i_u=(i_f, i_n, i_s)

## make report that identifies all types
report='\n'+20*'#'+'\nThis is the report:\n'
report+= whatis('i_f ',i_f)+'\n'
report+=whatis('i_n ',i_n)+'\n'
report+=whatis('i_s ',i_s)+'\n'
report+=whatis('i_l ',i_l)+'\n'
report+=whatis('i_u ',i_u)+'\n'
print(report)

그러면 디버깅을 위해 콜마다 창에 출력되며 보고서 작성 문자열도 생성됩니다.유일한 단점은 함수를 호출할 때마다 변수를 두 번 입력해야 한다는 것입니다.

저는 Python의 초보자이며, 이 방법을 통해 Python의 모든 오브젝트에 대한 대처 방법을 프로그램할 때 매우 유용하게 사용할 수 있습니다.한 가지 결함은 whatis()가 사용되는 프로시저 이외의 함수를 호출할 경우 실패한다는 것입니다.예를 들어 int(i_f)는 Python에서 int 함수를 알고 있기 때문에 유효한 함수 호출입니다.int(i_f**2)를 사용하여 whatis()를 호출할 수 있지만 어떤 이상한 이유로 int_squared라는 함수를 정의하는 경우 whatis()가 사용되는 절차 내에서 함수를 선언해야 합니다.

이것이 유용할 수 있습니다.

def Retriever(bar):
    return (list(globals().keys()))[list(map(lambda x: id(x), list(globals().values()))).index(id(bar))]

함수는 글로벌 스코프의 값 ID 목록(네임스페이스 편집 가능)을 살펴보고 ID를 기반으로 원하는/필수 변수 또는 함수의 인덱스를 찾은 다음 가져온 인덱스에 따라 글로벌 이름 목록에서 이름을 반환합니다.

프런트엔드와 json 스키마 및 상수를 통신하면서 해야 할 때마다 다음과 같이 클래스를 정의합니다.

class Param:
    def __init__(self, name, value):
        self.name = name
        self.value = value

그런 다음 이름과 값을 사용하여 변수를 정의합니다.

frame_folder_count = Param({'name':'frame_folder_count', 'value':10})

이제 개체를 사용하여 이름과 값에 액세스할 수 있습니다.

>>> frame_folder_count.name
'frame_folder_count'
>>> def varname(v, scope=None):
        d = globals() if not scope else vars(scope); return [k for k in d if d[k] == v]
...
>>> d1 = {'a': 'ape'}; d2 = {'b': 'bear'}; d3 = {'c': 'cat'}
>>> ld = [d1, d2, d3]
>>> [varname(d) for d in ld]
[['d1'], ['d2'], ['d3']]
>>> d5 = d3
>>> [varname(d) for d in ld]
[['d1'], ['d2'], ['d3', 'd5']]
>>> def varname(v, scope=None):
        d = globals() if not scope else vars(scope); return [k for k in d if d[k] is v]
...
>>> [varname(d) for d in ld]
[['d1'], ['d2'], ['d3', 'd5']]

여기에 나타나 있듯이 동일한 값 또는 짝수 주소를 가진 변수가 여러 개 있을 수 있으므로 래퍼를 사용하여 데이터와 함께 이름을 유지하는 것이 가장 좋습니다.

다음 메서드는 변수 이름을 반환하지 않지만 글로벌 범위에서 변수를 사용할 수 있는 경우 이 메서드를 사용하면 데이터 프레임을 쉽게 만들 수 있습니다.

class CustomDict(dict):
    def __add__(self, other):
        return CustomDict({**self, **other})

class GlobalBase(type):
    def __getattr__(cls, key):
        return CustomDict({key: globals()[key]})

    def __getitem__(cls, keys):
        return CustomDict({key: globals()[key] for key in keys})

class G(metaclass=GlobalBase):
    pass

x, y, z = 0, 1, 2

print('method 1:', G['x', 'y', 'z']) # Outcome: method 1: {'x': 0, 'y': 1, 'z': 2}
print('method 2:', G.x + G.y + G.z) # Outcome: method 2: {'x': 0, 'y': 1, 'z': 2}

A = [0, 1]
B = [1, 2]
pd.DataFrame(G.A + G.B) # It will return a data frame with A and B columns

검사 지역으로부터 이름을 얻으려고 하지만 a[1], b.val과 같은 var를 처리할 수 없습니다.그 후, 새로운 아이디어가 떠올랐습니다--- 코드로부터 var name을 취득해, 다음과 같이 succ! 코드를 시험합니다.

#direct get from called function code
def retrieve_name_ex(var):
    stacks = inspect.stack()
    try:
        func = stacks[0].function
        code = stacks[1].code_context[0]
        s = code.index(func)
        s = code.index("(", s + len(func)) + 1
        e = code.index(")", s)
        return code[s:e].strip()
    except:
        return ""

정의한 함수의 이름을 취득하려면 , 다음의 조작을 실행할 수 있습니다(단, 임베디드 기능에서는 동작하지 않습니다).

import re
def retrieve_name(func):
    return re.match("<function\s+(\w+)\s+at.*", str(func)).group(1)

def foo(x):
    return x**2

print(retrieve_name(foo))
# foo


개 수 .
'안녕하세요' = '안녕하세요' = '안녕하세요' = '안녕하세요'이다.

솔루션:

def find_var_name(val):

    dict_list = []
    global_dict = dict(globals())

    for k, v in global_dict.items():
        dict_list.append([k, v])
   
    return [item[0] for item in dict_list if item[1] == val]

var1 = 'hello'
var2 = 'hello'
find_var_name('hello')

출력

['var1', 'var2']

iDilip의 답변 압축 버전:

import inspect
def varname(x):
  return [k for k,v in inspect.currentframe().f_back.f_locals.items() if v is x][0]

hi = 123
print(varname(hi))

값이 같은 두 변수가 있으면 이전 사례 중 일부는 실패합니다.따라서 경고하는 것이 편리합니다.

정의 함수:

# Variable to string of variable name

def var_name(variable,i=0):

  results = []
  for name in globals():   
     if eval(name) == variable:
       results.append(name)

  if len(results) > 1:
    print('Warning:' )
    print('   var_name() has found',len(results), 'possible outcomes.')
    print('   Please choose the suitable parameter "i". Where "i" is the index')
    print('   that matches your choice from the list below.')
    print('  ',results) ; print('')

  return results[i]

용도:

var_1 = 10
var_name(var_1) # Output will be "var_1"

다음과 같은 값을 가진 변수가 두 개 있는 경우var_1 = 8 ★★★★★★★★★★★★★★★★★」var_2 = 8그러면 경고가 나타납니다.

var_1 = 8
var_2 = 8
var_name(var_2)  # Output will be "var_1" too but Warning will appear

인스턴스 변수의 이름은 클래스의 속성인 한 완전히 가져올 수 있습니다.

브렛 슬랫킨의 '이펙트 파이썬'에서 받은 거야도움이 되었으면 합니다.

클래스는 "Descriptor Protocol"의 일부인 get, setset_name dunder 메서드를 구현해야 합니다.

실행했을 때는, 다음과 같이 동작했습니다.

class FieldThatKnowsItsName():
    def __init__(self):
        self.name = None
        self._value= None
        self.owner = None
 
    def __set_name__(self, owner, name):
        self.name = name
        self.owner = owner
        self.owner.fields[self.name] = self

    def __get__(self, instance, instance_type):
        return self

    def __set__(self, instance, value):
        self = value

class SuperTable:
    fields = {}
    field_1=FieldThatKnowsItsName()
    field_2=FieldThatKnowsItsName()

table = SuperTable()
print(table.field_1.name)
print(table.field_2.name)

그런 다음 원하는 대로 메서드를 추가하고 데이터 유형을 확장할 수 있습니다.

보너스로 set_name(self, owner, name) dunder도 부모 인스턴스를 전달하므로 필드 클래스 인스턴스는 부모 인스턴스에 자신을 등록할 수 있습니다.

브렛 슬랫킨의 '이펙트 파이썬'에서 받은 거야구현 방법을 찾는 데 시간이 걸렸습니다.

는 '있다'로 수 .kwargs문자열로 반환합니다.

var=2
def getVarName(**kwargs):
    return list(kwargs.keys())[0]

print (getVarName(var = var))

참고: 변수 이름은 변수 이름과 같아야 합니다.

코멘트에 기재되어 있는 것처럼, 데이터 프레임의 리스트가 이미 있는 경우는, 그 리스트를 문자열의 리스트로 하는 것이 간단합니다.변수 목록에서 문자열로 이동하는 대신 f-string과 결합된 삽입 exec 함수를 사용하여 문자열에서 변수 목록으로 이동합니다(변수가 이미 할당되어 있다고 가정합니다).vel,vol , , , , 입니다.area기존 팬더 데이터 프레임의 변수 이름입니다.

다음 경우:

dfstr_list = [
              'vel',
              'vol',
              'area'
             ]

이것은 목록을 반복하고 각 데이터 프레임을 사용하여 Excel에 쓰고 시트 이름을 정의합니다.

for dfstr in dfstr_list:
    if dfstr in globals():
        exec(f"{dfstr}.to_excel(writer,sheet_name=dfstr)")

언급URL : https://stackoverflow.com/questions/18425225/getting-the-name-of-a-variable-as-a-string

반응형