[python] 현재 모듈에서 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 온라인 문서는이 특정 차이점에 대해 약간 혼란 스러울 수 있습니다).


답변

모듈 내에서 모듈 범위 변수를 설정해야하는 경우 무엇이 문제 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']


답변

Python 3.7에서는 __getattr__모듈 수준에서 사용할 수 있습니다 ( 관련 답변 ).

PEP 562 당 :

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


답변

  1. 당신은하지 않을 것입니다. 당신은 할 것globals()["SOME_CONSTANT"] = 42
  2. 당신은하지 않을 것입니다. 모듈이 아닌 다른 곳에 동적으로 생성 된 컨텐츠를 저장합니다.

답변