zoukankan      html  css  js  c++  java
  • python循环导入的问题

    1、问题

    循环导入,代码如下:

    from c import c
    def b():
        print('b')
    b.py
    from b import b
    
    def a():
        # from b import b
        print('a')
        b()
    a.py
    from a import a
    
    def c():
        print('c')
        a()
    c.py
    from c import c
    from a import a
    from b import b
    
    c()
    b()
    a()
    start.py

    然后执行start.py,发现报错

    Traceback (most recent call last):
      File "/home/felix/PycharmProjects/DRF/test/u.py", line 5, in <module>
        from c import c
      File "/home/felix/PycharmProjects/DRF/test/c.py", line 8, in <module>
        from a import a
      File "/home/felix/PycharmProjects/DRF/test/a.py", line 16, in <module>
        from b import b
      File "/home/felix/PycharmProjects/DRF/test/b.py", line 8, in <module>
        from c import c
    ImportError: cannot import name 'c'

    原因分析:因为a导入b,b导入c,c导入a的时候,都还没有执行到函数定义的代码,所以找不到模块。

    2、解决方法一:

    改用导入包的方式,不用导入具体函数的方式

    import b
    
    def a():
        print('a')
        b.b()
    a.py
    import c
    
    def b():
        print('b')
    b.py
    import a
    
    def c():
        print('c')
        a.a()
    c.py
    from c import c
    from a import a
    from b import b
    
    c()
    b()
    a()
    u.py

    3、解决方法二:

    在函数内导入,不在全局导入

    def a():
        print('a')
        from b import b
        b()
    a.py
    import c
    
    def b():
        print('b')
    b.py
    def c():
        print('c')
        from a import a
        a()
    c.py
    from c import c
    from a import a
    from b import b
    
    c()
    b()
    a()
    u.py

    4、解决方案三:

    重构代码,合并

    def b():
        print('b')
    
    
    def a():
        print('a')
        b()
    
    
    def c():
        print('c')
        from a import a
        a()
    abc_combine.py
    from abc_combine import a, b, c
    
    c()
    b()
    a()
    u.py

    循环导入问题的解决方案有三种,推荐方案三重构代码,如果实在不想重构代码,建议方案二。

  • 相关阅读:
    canvas实现圆角图片 (处理原图是长方形或正方形)
    px2rem在vue项目中的使用
    fastclick在混合app内卡死
    禁止网页的右键和复制功能
    2.Knockout.Js(监控属性Observables)
    1.Knockout.Js(简介)
    KnockoutJS学习笔记10:KonckoutJS foreach绑定
    mvc中使用knockoutjs和ajax
    15个最好的Bootstrap设计工具推荐
    在WIN7下安装运行mongodb 1)、下载MongoDB
  • 原文地址:https://www.cnblogs.com/felixwang2/p/10095740.html
Copyright © 2011-2022 走看看