欢迎来到Felix的博客

Do the right things! And talk is cheap,show me your code!

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

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

 

posted @ 2018-12-10 12:19  寂静的天空  阅读(3610)  评论(0编辑  收藏  举报
个人感悟: 一个人最好的镜子就是自己,你眼中的你和别人眼中的你,不是一回事。有人夸你,别信;有人骂你,别听。一根稻草,扔街上就是垃圾;捆上白菜就是白菜价;捆上大闸蟹就是大闸蟹的价。 一个人,不狂是没有出息的,但一直狂,肯定是没有出息的。雨打残花风卷流云,剑影刀光闪过后,你满脸冷酷的站在珠峰顶端,傲视苍生无比英武,此时我问你:你怎么下去? 改变自己就是改变自己的心态,该沉的时候沉下去,该浮的时候浮上来;不争名夺利,不投机取巧,不尔虞我诈;少说、多听、多行动。人每所谓穷通寿夭为命所系,岂不知造物之报施,全视人之自取。 座佑铭:每一个不曾起舞的日子,都是对生命的辜负。