codememo

현재 모듈에서 setattr()을 어떻게 호출합니까?

tipmemo 2023. 6. 7. 22:55
반응형

현재 모듈에서 setattr()을 어떻게 호출합니까?

첫 번째 매개 변수 "로 전달할 항목"object본분을 다하여setattr(object, name, value)현재 모듈에 변수를 설정하시겠습니까?

예:

setattr(object, "SOME_CONSTANT", 42);

다음과 같은 효과 제공:

SOME_CONSTANT = 42

이 라인을 포함하는 모듈 내에서(올바른 라인 포함)object).

모듈 수준에서 동적으로 여러 값을 생성합니다. 정의할 수 없습니다.__getattr__모듈 레벨에서, 이것은 제 예비 부품입니다.

import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

또는 사용하지 않고setattr(문제의 문자는 깨지지만 실질적인 목적은 동일함;-):

globals()[name] = value

참고: 모듈 범위에서 후자는 다음과 같습니다.

vars()[name] = value

이것은 조금 더 간결하지만, 함수 내에서 작동하지 않습니다.vars()호출된 범위의 변수를 제공합니다. 전역 범위에서 호출되었을 때 모듈의 변수를 사용하고 R/W를 사용해도 괜찮지만 함수에서 호출되었을 때 함수의 변수를 R/O로 처리해야 합니다. 파이썬 온라인 문서는 이 특정한 구별에 대해 약간 혼란스러울 수 있습니다.

Python 3.7에서는__getattr__모듈 레벨(관련 답변)에서 확인할 수 있습니다.

PEP 562에 따라:

def __getattr__(name):
    if name == "SOME_CONSTANT":
        return 42
    raise AttributeError(f"module {__name__} has no attribute {name}")

모듈 내에서 모듈 범위 변수를 설정해야 하는 경우, 어떤 문제가 있습니까?global?

# my_module.py

def define_module_scoped_variables():
    global a, b, c
    a, b, c = 'a', ['b'], 3

따라서:

>>> import my_module
>>> my_module.define_module_scoped_variables()
>>> a
NameError: name 'a' is not defined
>>> my_module.a
'a'
>>> my_module.b
['b']
  1. 넌 그러지 않을 거다.당신은 할 것입니다.globals()["SOME_CONSTANT"] = 42
  2. 넌 그러지 않을 거다.동적으로 생성된 콘텐츠는 모듈이 아닌 다른 곳에 저장할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2933470/how-do-i-call-setattr-on-the-current-module

반응형