如何在当前模块上调用 setattr()?
- 2025-04-16 08:55:00
- admin 原创
- 24
问题描述:
我应该将什么作为第一个参数“ object
”传递给函数setattr(object, name, value)
,以在当前模块上设置变量?
例如:
setattr(object, "SOME_CONSTANT", 42);
效果如下:
SOME_CONSTANT = 42
在包含这些行的模块内(使用正确的object
)。
我在模块级别动态生成几个值,由于我无法__getattr__
在模块级别定义,所以这是我的后备。
解决方案 1:
import sys
thismodule = sys.modules[__name__]
setattr(thismodule, name, value)
或者,不使用setattr
(这破坏了问题的字面意思,但满足了相同的实际目的;-):
globals()[name] = value
注意:在模块范围内,后者等同于:
vars()[name] = value
这更简洁一些,但在函数内部不起作用(vars()
给出其调用范围的变量:在全局范围内调用时模块的变量,然后可以使用 R/W,但在函数中调用时函数的变量,然后必须将其视为 R/O——Python 在线文档对这种特定区别可能会有点困惑)。
解决方案 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:
如果必须在模块内部设置模块范围变量,那么有什么问题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']
解决方案 4:
你不会。你会
globals()["SOME_CONSTANT"] = 42
你不会。你会把动态生成的内容存储在模块以外的地方。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD