新聞中心
小編給大家分享一下解決python循環(huán)引用報錯的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
站在用戶的角度思考問題,與客戶深入溝通,找到清水網(wǎng)站設計與清水網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站建設、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋清水地區(qū)。
最近在開發(fā)智能家居項目hestia-rpi項目中,由于代碼結構層級劃分不合理,導致了循環(huán)引用(import)module失敗的問題,錯誤如下:
Traceback (most recent call last): File "./main.py", line 8, in <module> from hestiarpi.library.server import server File "/home/pi/server/hestiarpi/library/server/server.py", line 4, in <module> from hestiarpi.library.brain import handler File "/home/pi/server/hestiarpi/library/brain/handler.py", line 5, in <module> from hestiarpi.library.brain import monitor File "/home/pi/server/hestiarpi/library/brain/monitor.py", line 6, in <module> from hestiarpi.library.server import server ImportError: cannot import name server
原理
這個時候就有一個問題,當前腳本Main第一次執(zhí)行,需要執(zhí)行from A import ,發(fā)現(xiàn)沒有A,就新建一個A在內(nèi)存中,然后填充A模塊的信息,就會去執(zhí)行A,此時,A里面要 from Main import D,那么因為Main已被執(zhí)行,就直接從內(nèi)存的map中取得Main的信息,不過此時Main的信息還沒有填充完,因為之前就是為了填充才轉(zhuǎn)到A的,這時從已有的空的Main中拿不到D,就會報錯,ImportError。
解決方案
方案一、合理劃分項目代碼層級
循環(huán)引用最大的本質(zhì)問題是代碼層級結構劃分的不合理,所以最根本的、最合理的解決方案就是重新劃分好代碼的層級結構,使其合理化,自然就規(guī)避了循環(huán)引用的麻煩。
方案二、只引用當前的包,不引用具體的模塊
如果你的代碼是這樣,那么這種方式是會奏效的。
修改前
# a.py from B import b def a(): pass # some codes # b.py from A import a def b(): a.a() #some codes
修改后
# a.py from B import b def a(): pass # some codes # b.py import A def b(): A.a.a() #some codes
方案三、將引用放到函數(shù)內(nèi)部
如果你的代碼是這樣,那么這種方式是會奏效的。
修改前
# a.py from B import b def a(): pass # some codes # b.py from A import a def b(): a.a() #some codes
修改后
# a.py from B import b def a(): pass # some codes # b.py def b(): from A import a a.a() #some codes
看完了這篇文章,相信你對解決python循環(huán)引用報錯的方法有了一定的了解,想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
新聞名稱:解決python循環(huán)引用報錯的方法
文章分享:http://fisionsoft.com.cn/article/gsgeho.html