我将作为第一个参数传递什么”object“到功能 setattr(object, name, value), ,要在当前模块上设置变量?

例如:

setattr(object, "SOME_CONSTANT", 42);

给出与:

SOME_CONSTANT = 42

在包含这些行的模块中(正确 object).

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

有帮助吗?

解决方案

import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

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

globals()[name] = value

笔记: :在模块范围,后者等同于:

vars()[name] = value

这有点简洁,但在函数中不起作用(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

因此:

>>> 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}")
  1. 你不会。你会做的 globals()["SOME_CONSTANT"] = 42
  2. 你不会。您将在模块以外的其他地方存储动态生成的内容。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top