• 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

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

  • 相关阅读:
    UICollectionView 布局
    ios 调用支付宝
    iOS POST 上传图片
    ios 判断字符串是否为空
    让写代码成为每天的习惯
    gocron_跨平台定时任务管理器
    monkey做安卓APP的黑盒自动化测试
    Android自动化测试框架分析
    联合查询中where 和and的区别
    JIRA中导出BUG列表是CSV格式的,打开后是乱码
  • 原文地址:https://www.cnblogs.com/felixwang2/p/10095740.html
Copyright © 2020-2023  润新知