你能用模块共享状态吗?

时间:2014-04-05 07:19:19

标签: python

仅在需要时初始化Python模块。您是否可以利用这一事实以这种方式在模块之间共享状态:

# a.py
import random
state = { 'foo' : random.random() } 

# b.py
from a import state 

# c.py
from a import state

当b和c在同一个进程中运行时,假设b和c中的'state'总是引用同一个实例是否安全?

2 个答案:

答案 0 :(得分:3)

扩展/澄清C1phr的答案:

只要a,b和c都没有为state分配新值,三个模块中的

state将引用同一个对象。如果三个模块中的任何一个state = <something else>,它将不同步。模块可以安全地改变值(例如,通过执行state['blah'] = 'stuff'),而不是分配新值。

正如C1phr所说,你可以通过总是通过包含它的模块引用变量来防范这种情况,如a.state(来自bc)。

理论上有一些方法可以重新加载一个模块,从而使变量不同步,但这些方法并不常见或不合需要。例如,显然如果有人reload(a),那么a将被重新加载,而b和c将不知道这一点。但这是一件不寻常的事情。此外,模块可能是imported twice via different paths,如果您没有跟踪这两个版本,这可能会使变量似乎不同步。但是以这种方式两次导入相同的模块无论如何都是一个错误。

答案 1 :(得分:1)

由于Python在导入时对变量和函数的处理方式相同,这将起作用,但变量将被复制到新的命名空间中。这样就可以了,直到你想要改变state的值,这只会反映在你进行更改的命名空间中。如果你想拥有读写权限,那么你最好用:

import a

然后使用

访问变量
MY_VAR = a.state

并使用

进行设置
a.state = MY_NEW_STATE

请参阅:https://stackoverflow.com/a/1086705/2047504