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

循環導入問題的解決方案有三種,推薦方案三重構代碼,如果實在不想重構代碼,建議方案二。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM