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

时间:2010-05-29 02:07:23

标签: python module global-variables getattr setattr

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

例如:

setattr(object, "SOME_CONSTANT", 42);

给出与以下相同的效果:

SOME_CONSTANT = 42

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

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

4 个答案:

答案 0 :(得分:191)

import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

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

globals()[name] = value

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

vars()[name] = value

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

答案 1 :(得分: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']

答案 2 :(得分:4)

在Python 3.7中,您将能够在模块级别使用__getattr__related answer)。

PEP 562

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

答案 3 :(得分:-1)

  1. 你不会。你会做globals()["SOME_CONSTANT"] = 42
  2. 你不会。您可以将动态生成的内容存储在模块以外的其他位置。