當(dāng)項(xiàng)目中的模塊過多,或功能劃分不夠清晰時會出現(xiàn)循環(huán)引用的問題,如下
有兩個模塊moduleA 和 moduleB:
#moduleA
from moduleB import b
def a():
print 'aaaaaaaa'
b()
def c():
print 'cccc'
if __name__ == '__main__':
a()
#moduleB
from moduleA import c
def b():
print 'bbbbbbbbbb'
c()
這種情況下就會出現(xiàn)以下的錯誤 :
Traceback (most recent call last):
File "D:/PycharmProjects/untitled2/moduleA.py", line 1, in <module>
from moduleB import b
File "D:\PycharmProjects\untitled2\moduleB.py", line 2, in <module>
from moduleA import c
File "D:\PycharmProjects\untitled2\moduleA.py", line 1, in <module>
from moduleB import b
ImportError: cannot import name b
這就是循環(huán)引用導(dǎo)致的
導(dǎo)入的實(shí)質(zhì)
導(dǎo)入其實(shí)是要將 被導(dǎo)入模塊所有的頂格代碼都執(zhí)行一遍,遇到函數(shù)和類的定義會作申明。
如果b模塊中有這么一句
print 'bbb'
你在a模塊impot b時就會 執(zhí)行 print 'bbb'這一句。
回到循環(huán)引用中,首先導(dǎo)入B,進(jìn)入B中,發(fā)現(xiàn)B中又導(dǎo)入了A又回到A中,但是A又導(dǎo)入B這就形成了循環(huán)引用。
解法1:直接導(dǎo)入模塊名,通過模塊調(diào)用其中的函數(shù)
import moduleB
def a():
print 'aaaaaaaa'
moduleB.b()
def c():
print 'cccccc'
if __name__ == '__main__':
a()
*************************************
import moduleA
def b():
print 'bbbbbbbbbb'
moduleA.c()
具體原因我也不太清楚。
解法2:使用延遲導(dǎo)入(lazy import)
在需要用的函數(shù)內(nèi)部導(dǎo)入,或是在底部導(dǎo)入
moduleB
***************
def b():
print 'bbbbbbbbbb'
c()
from moduleA import c
**************************
或者
def b():
from moduleA import c
print 'bbbbbbbbbb'
c()
解法3:重新設(shè)計代碼結(jié)構(gòu),將代碼和并或者分離
這個要看情況 而定了,將公共功能的代碼分離成單獨(dú)模塊,或者將一些具有關(guān)系的代碼合并成一個模塊。