Mat*_*ner 128 python module global-variables setattr getattr
我作为第一个参数" object
"传递给函数setattr(object, name, value)
,在当前模块上设置变量?
例如:
setattr(object, "SOME_CONSTANT", 42);
Run Code Online (Sandbox Code Playgroud)
产生同样的效果:
SOME_CONSTANT = 42
Run Code Online (Sandbox Code Playgroud)
在包含这些行的模块中(正确object
).
我在模块级别动态生成多个值,而我无法__getattr__
在模块级别定义,这是我的后备.
Ale*_*lli 200
import sys
thismodule = sys.modules[__name__]
setattr(thismodule, name, value)
Run Code Online (Sandbox Code Playgroud)
或者,不使用setattr
(打破问题的字母,但满足相同的实际目的;-):
globals()[name] = value
Run Code Online (Sandbox Code Playgroud)
注意:在模块范围内,后者相当于:
vars()[name] = value
Run Code Online (Sandbox Code Playgroud)
这是一个更简洁,但不能在函数内工作(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
Run Code Online (Sandbox Code Playgroud)
从而:
>>> import my_module
>>> my_module.define_module_scoped_variables()
>>> a
NameError: name 'a' is not defined
>>> my_module.a
'a'
>>> my_module.b
['b']
Run Code Online (Sandbox Code Playgroud)
在Python 3.7中,您将可以__getattr__
在模块级别使用(相关答案)。
根据PEP 562:
def __getattr__(name):
if name == "SOME_CONSTANT":
return 42
raise AttributeError(f"module {__name__} has no attribute {name}")
Run Code Online (Sandbox Code Playgroud)