【问题标题】:Python can you reload `from x import y` from another module z?Python 你可以从另一个模块 z 重新加载 `from x import y` 吗?
【发布时间】:2017-10-25 08:20:06
【问题描述】:

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

模块一:

# 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

Ref:我查看了this,但它更像是在模块 b 中刷新。

【问题讨论】:

    标签: python


    【解决方案1】:

    如果事情的结构与您在问题正文中编写示例的方式完全相同(但不是在您的标题中),那么对我来说,在 Python 2.7 中,c.py 中的简单 reload(a) 可以按照您的意愿工作:

    # 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
    

    这表明cb的角度成功刷新了a.MAPPINGS

    现在,如果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' 和在模块 a 中创建的原始 dict 之间创建自己的关联。如果重新运行a.py,它会创建一个新的dict,但模块b 仍然包含并使用它自己对旧的引用。所以现在你会得到两个相同的时间戳。有两个潜在的修复:(1)更改为import a + a.MAPPINGS,而不是from a import MAPPINGS + MAPPINGS,或(2)将导入向下移动到dowork(),因此刷新的MAPPINGS是每次要使用时在本地重新导入:

    # b.py
    def dowork():
        from a import MAPPINGS
        for key,value in MAPPINGS.iteritems():
            print key
    

    我会采用方法(1)。

    【讨论】:

    • 其实不是这样的。我会采用方法 (1) if 你强迫我使用 reload 作为解决方案的一部分,但根据可维护性/可理解性的一般原则,我会避免这样做首先。相反,我会将刷新和返回-MAPPINGS 的过程作为模块 a 中的一个函数。
    猜你喜欢
    • 2015-07-31
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2019-08-25
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多