美文网首页
再谈python中的引用

再谈python中的引用

作者: alanhoo74 | 来源:发表于2020-09-26 17:20 被阅读0次

    最近在开发项目中,遇到一个文件,类似循环引用,但又不完全是。

    形式如下,有两套一样的模块逻辑,每套都有一个run.py,还有一个pack.py,两个pack.py都引用了ref_comm.py模块。

    #run1.py
    import pack1
    if __name__ == "__main__":
        print("run 1")
    
    #run2.py
    import pack1
    if __name__ == "__main__":
        print("run 2")
    
    #pack1.py
    from ref_comm import C1
    
    #pack2.py
    from ref_comm import C2
    
    #ref_comm.py
    
    import pack1
    import pack2
    
    class C1:
        pass
    
    class C2:
        pass
    

    在ref_comm.py中使用import pack1和pack2,会对运行造成影响:例如运行run1.py,需要注释掉ref_comm.py中的import pack2,否则运行报错,说找不到pack2.C2。

    ImportError: cannot import name 'C2' from partially initialized module 'ref_comm' (most likely due to a circular import)
    

    一直以为是循环引用的问题,但是这里应该不完全是,主要是加载不完整导致的无法应用。

    运行run1时,引用pack1,接着引用ref_comm,然后ref_comm反过来引用pack2,pack2又引用ref_comm里的C2,但是这使ref_comm尚未加载完成,C2还无法引用,所以pack2的执行就终止报错了。

    如果把ref_comm.py里的import都挪到class C2定义的下方,运行就没有问题了,这也从侧面证实了问题产生的原因。

    相关文章

      网友评论

          本文标题:再谈python中的引用

          本文链接:https://www.haomeiwen.com/subject/gjzcuktx.html