如何在当前模块上调用 setattr() ?

作为函数 setattr(object, name, value)的第一个参数“ object”传递什么来设置当前模块上的变量?

例如:

setattr(object, "SOME_CONSTANT", 42);

产生与下列情况相同的效果:

SOME_CONSTANT = 42

在包含这些行的模块内(使用正确的 object)。

我在模块级别动态地生成几个值,由于我不能在模块级别定义 __getattr__,所以这是我的备用方案。

67868 次浏览
import sys


thismodule = sys.modules[__name__]


setattr(thismodule, name, value)

或者,不使用 setattr(它打破了问题的字母,但满足同样的实际目的;) :

globals()[name] = value

注意 : 在模块范围内,后者相当于:

vars()[name] = value

它更简洁一些,但是不能在函数内部工作(vars()给出了调用范围的变量: 在全局范围内调用时模块的变量,然后可以使用 R/W,但是在函数中调用时函数的变量,然后必须作为 R/O 处理—— Python 在线文档可能对这个特定的区别有点混淆)。

  1. 你不会的,你会做 globals()["SOME_CONSTANT"] = 42
  2. 你不会,你会把动态生成的内容存储在模块以外的地方。

如果必须从模块内部设置模块范围的变量,那么 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}")