问题:如何在当前模块上调用setattr()?
如何将第一个参数“ object”传递给函数setattr(object, name, value),以在当前模块上设置变量?
例如:
setattr(object, "SOME_CONSTANT", 42);具有与以下相同的效果:
SOME_CONSTANT = 42在包含这些行的模块中(带有正确的object)。
我在模块级别动态生成几个值,由于无法__getattr__在模块级别定义,所以这是我的后备。
回答 0
import sys
thismodule = sys.modules[__name__]
setattr(thismodule, name, value)或者,不使用setattr(打破问题的字母,但满足相同的实际目的;-):
globals()[name] = value注意:在模块范围内,后者等效于:
vars()[name] = value这更加简洁,但是在函数内部不起作用(vars()给出在其范围内调用的变量:在全局范围内调用时模块的变量,然后可以使用R / W,但在函数中可以使用变量在函数中调用时,然后必须将其视为R / O - Python在线文档对此特定区别可能会造成混淆。
回答 1
如果必须从模块内部设置模块范围的变量,那有什么问题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']回答 2
在Python 3.7中,您将可以__getattr__在模块级别使用(相关答案)。
根据PEP 562:
def __getattr__(name):
    if name == "SOME_CONSTANT":
        return 42
    raise AttributeError(f"module {__name__} has no attribute {name}")回答 3
- 你不会的 你会做globals()["SOME_CONSTANT"] = 42
- 你不会的 您会将动态生成的内容存储在模块以外的其他位置。
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

