python循环导入的问题

Posted Felix Wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

 

以上是关于python循环导入的问题的主要内容,如果未能解决你的问题,请参考以下文章

有条件地导入 python 类的片段

循环导入的python解决方法

循环通过 python 正则表达式匹配

Python - 循环加速 - 大型数据集

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

python 循环导入的问题