來源:https://www.cnblogs.com/shengulong/p/10140225.html
當項目中的模塊過多,或功能划分不夠清晰時會出現循環引用的問題,如下
有兩個模塊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()
這種情況下就會出現以下的錯誤 :
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
這就是循環引用導致的
導入的實質
導入其實是要將 被導入模塊所有的頂格代碼都執行一遍,遇到函數和類的定義會作申明。
如果b模塊中有這么一句
print 'bbb'
你在a模塊impot b時就會 執行 print 'bbb'這一句。
回到循環引用中,首先導入B,進入B中,發現B中又導入了A又回到A中,但是A又導入B這就形成了循環引用。
解法1:直接導入模塊名,通過模塊調用其中的函數
#moduleA
import moduleB def a(): print 'aaaaaaaa' moduleB.b() def c(): print 'cccccc' if __name__ == '__main__': a() *************************************
#moduleB
import moduleA def b(): print 'bbbbbbbbbb' moduleA.c()
具體原因我也不太清楚。
解法2:使用延遲導入(lazy import)
在需要用的函數內部導入,或是在底部導入
moduleB
***************
def b(): print 'bbbbbbbbbb' c() from moduleA import c ************************** 或者 def b(): from moduleA import c print 'bbbbbbbbbb' c()
解法3:重新設計代碼結構,將代碼和並或者分離
這個要看情況 而定了,將公共功能的代碼分離成單獨模塊,或者將一些具有關系的代碼合並成一個模塊。