python各個模組迴圈引用問題解決辦法

2021-10-05 08:09:20 字數 2029 閱讀 7444

當專案中的模組過多,或功能劃分不夠清晰時會出現迴圈引用的問題,如下

有兩個模組modulea 和 moduleb:

'''

想最快的入門python嗎?請搜尋:"泉小朵",來學習python最快入門教程。

也可以加入我們的python學習q群:902936549,送給每一位python的小夥伴教程資料。

'''#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 from moduleb import b

file "d:\pycharmprojects\untitled2\moduleb.py", line 2, in from modulea import c

file "d:\pycharmprojects\untitled2\modulea.py", line 1, in 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:直接匯入模組名,通過模組呼叫其中的函式

'''

想最快的入門python嗎?請搜尋:"泉小朵",來學習python最快入門教程。

也可以加入我們的python學習q群:902936549,送給每一位python的小夥伴教程資料。

'''#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:重新設計**結構,將**和並或者分離

這個要看情況 而定了,將公共功能的**分離成單獨模組,或者將一些具有關係的**合併成乙個模組。

python各個模組迴圈引用問題解決辦法

當專案中的模組過多,或功能劃分不夠清晰時會出現迴圈引用的問題,如下 有兩個模組modulea 和 moduleb modulea from moduleb import b def a print aaaaaaaa b def c print cccc if name main a moduleb ...

python各個模組

os.listdir path 以list形式返回路徑下的所有檔名,傳入path時要注意一點,路徑中的反斜線最好使用兩個,使用乙個反斜線加字母容易產生反義歧義 執行結果 注意這個list是無序的 python os官方文件 sort 該函式可以給陣列,鍊錶list或者向量排序,用法 sort fir...

python 模組引用 python如何引用模組

模組實際上就是 以.py為結尾的檔案 注意點 自定義的模組盡量不要和系統模組重名 模組內部封裝了很多實用的功能,有時在模組外部呼叫就需要將其匯入,匯入模組簡單劃分,實際上就只有兩種 import from import 詳細一點劃分有五種 1,improt 模組名 呼叫 模組名.功能名 2,impo...