我应该将第一个参数 "object
" 传递给函数 setattr(object, name, value)
,以在当前模块上设置变量吗?
举个例子:
setattr(object, "SOME_CONSTANT", 42);
给出与以下代码相同的效果:
SOME_CONSTANT = 42
在包含这些代码行的模块中(使用正确的object
)。
我在模块级别动态生成了多个值,由于我无法在模块级别定义__getattr__
,所以这是我的备选方案。
我应该将第一个参数 "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()
会返回它被调用时所在作用域的变量:当在全局作用域调用时返回模块变量,此时可以读写,但如果在函数中调用,则返回函数的变量,此时必须视为只读。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']
globals()["SOME_CONSTANT"] = 42
SOME_CONSTANT
并不完全是常量。如果你无法使用globals()
,那么你必须访问另一个模块来修改其属性;这肯定会引起人们的疑惑。 - msw
vars()
而不是在函数内部调用时,它会起作用。 - Mike Grahamvars()
在模块作用域下等同于globals()
(因此返回一个真正的可修改字典),但在函数作用域下等同于locals()
(因此返回一个永远不会被修改的伪字典)。我在模块作用域下使用vars()
,因为与其在该作用域中的同义词globals()
相比,它可以省下3个字符,一个音节;-) - Alex Martelliexec''
:比较一下带有几个实质性循环的函数的时间,你就会看到这个核心优化对Python性能的重要性。 - Alex Martelli