Python你可以从另一个模块z重新加载`from x import y`吗?

时间:2017-05-24 20:15:04

标签: python

我正在处理一些遗留代码,我需要为另一个模块刷新一些导入的变量。例如

模块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中的更新。

1 个答案:

答案 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)。