python解決循環(huán)引用問題

當(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)系的代碼合并成一個模塊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容