我正在处理一些遗留代码,我需要为另一个模块刷新一些导入的变量。例如
模块a:
# load from database
MAPPINGS = {...}
模块b:
import a
def dowork():
for key,value in a.MAPPINGS.iteritems():
print key
模块c:
# admin section
def manage_mapping():
....
# refresh a.MAPPINGS
让我们假设a.MAPPINGS被导入其他模块e, f, g
等,是否可以重新加载模块a.MAPPINGS而所有其他模块都获得一个新的a.MAPPINGS
?
参考:我看了this,但更像是模块b中的更新。
答案 0 :(得分:1)
如果事情的结构完全按照您在问题正文中编写示例的方式(但不在标题中),那么在Python 2.7中,reload(a)
中的一个简单c.py
就可以了如你所愿:
# a.by
import time
MAPPINGS = {time.strftime('%Y-%m-%d %H:%M:%S'):''}
# b.py
import a
def dowork():
for key,value in a.MAPPINGS.iteritems():
print key
# c.py
import a
def manage_mapping():
reload(a)
if __name__ == '__main__':
import time
from b import dowork
dowork()
time.sleep(2)
manage_mapping()
dowork()
如果我这样做
$ python c.py
然后我得到:
2017-05-24 16:31:31
2017-05-24 16:31:33
表示c
已成功从a.MAPPINGS
的角度刷新b
。
现在,如果b.py
包含from a import MAPPINGS
(如 title 中),后跟MAPPINGS
的引用,而不是import a
后跟对a.MAPPINGS
的引用,然后是不同的:
# b.py
from a import MAPPINGS
def dowork():
for key,value in MAPPINGS.iteritems():
print key
在这种情况下,b.py
会在名称'MAPPINGS'
与模块dict
中创建的原始 a
之间创建自己的关联。如果重新运行a.py
,则会创建一个新的dict
,但模块b
仍然包含并使用它自己对旧的引用。所以现在你得到两个相同的时间戳。有两种可能的解决方法:(1)如上所述更改为import a
+ a.MAPPINGS
,而不是from a import MAPPINGS
+ MAPPINGS
,或(2)将导入更改为{{ 1}}所以每次要使用刷新的dowork()
都会在本地重新导入:
MAPPINGS
我会选择方法(1)。