如何在运行时向模块添加属性?

jlc*_*lin 15 python

我需要在运行时添加模块属性.例如,加载模块时,它会读取包含数据的文件.我希望这些数据可用作模块属性,但数据仅在运行时可用.

如何在运行时添加模块属性?

jlc*_*lin 28

谢谢@Dharmesh.这就是我所需要的.只需要进行一项更改.该模块不会自行导入,以便获取我可以执行的模块对象:

setattr(sys.modules[__name__], 'attr1', 'attr1')


Jef*_*uer 10

如果在运行时之前不知道属性名称,请使用setattr:

>>> import mymodule
>>> setattr(mymodule, 'point', (1.0, 4.0))
>>> mymodule.point
(1.0, 4.0)
Run Code Online (Sandbox Code Playgroud)

  • @John Machin:在这种情况下,@ Jeremy可以像Werkzeug代码那样做一些模块魔术:https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/__init__.py (2认同)

小智 5

模块属性是模块全局范围内的变量。

如果你想在“运行时”从模块本身设置一个属性,正确的方法是

globals()['name'] = value
Run Code Online (Sandbox Code Playgroud)

(注意:此方法仅适用于全局变量,不适用于本地变量。)

如果要从导入模块的范围设置属性,只需设置它:

import myModule
setattr(myModule, 'name', 10)
Run Code Online (Sandbox Code Playgroud)

完整示例:

#m.py
def setGlobal(name, value):
    globals()[name] = value
Run Code Online (Sandbox Code Playgroud)

——

#main.py
import m

m.setGlobal('foo', 10)
print(m.foo) #--> 10

#Moreover:

from m import foo
print(foo) #--> 10   (as Expected)

m.setGlobal('foo', 20)
print(m.foo) #--> 20  (also as expected)

#But:
print(foo) #--> 10
Run Code Online (Sandbox Code Playgroud)