首页 > 编程语言 > 详细

python循环导入的问题

时间:2018-12-10 13:18:10      阅读:149      评论:0      收藏:0      [点我收藏+]

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循环导入的问题

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!