158

我应该将什么作为第一个参数“ object”传递给函数setattr(object, name, value),以在当前模块上设置变量?

例如:

setattr(object, "SOME_CONSTANT", 42);

产生与以下相同的效果:

SOME_CONSTANT = 42

在包含这些行的模块中(带有正确的object)。

我在模块级别动态生成多个值,并且由于我无法__getattr__在模块级别定义,这是我的后备。

4

4 回答 4

260
import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

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

globals()[name] = value

注意:在模块范围内,后者等价于:

vars()[name] = value

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

于 2010-05-29T02:11:38.297 回答
13

在 Python 3.7 中,您将能够__getattr__在模块级别使用(相关答案)。

根据PEP 562

def __getattr__(name):
    if name == "SOME_CONSTANT":
        return 42
    raise AttributeError(f"module {__name__} has no attribute {name}")
于 2018-03-18T01:17:11.513 回答
6

如果您必须从模块内设置模块范围的变量,那有什么问题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']
于 2010-05-29T03:11:29.717 回答
-1
  1. 你不会的。你会做globals()["SOME_CONSTANT"] = 42
  2. 你不会的。您可以将动态生成的内容存储在模块以外的某个地方。
于 2010-05-29T02:23:31.040 回答