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

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

原文地址:https://www.cnblogs.com/felixwang2/p/10095740.html