Python中循環(huán)引用(import)失敗的解決方法
前言
最近在開發(fā)智能家居項(xiàng)目hestia-rpi項(xiàng)目中,由于代碼結(jié)構(gòu)層級(jí)劃分不合理,導(dǎo)致了循環(huán)引用(import)module失敗的問題,錯(cuò)誤如下:
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
原理
這個(gè)時(shí)候就有一個(gè)問題,當(dāng)前腳本Main第一次執(zhí)行,需要執(zhí)行from A import ,發(fā)現(xiàn)沒有A,就新建一個(gè)A在內(nèi)存中,然后填充A模塊的信息,就會(huì)去執(zhí)行A,此時(shí),A里面要 from Main import D,那么因?yàn)镸ain已被執(zhí)行,就直接從內(nèi)存的map中取得Main的信息,不過此時(shí)Main的信息還沒有填充完,因?yàn)橹熬褪菫榱颂畛洳呸D(zhuǎn)到A的,這時(shí)從已有的空的Main中拿不到D,就會(huì)報(bào)錯(cuò),ImportError。
來自:http://www.dhdzp.com/article/138673.htm
解決方案
方案一 合理劃分項(xiàng)目代碼層級(jí)
循環(huán)引用最大的本質(zhì)問題是代碼層級(jí)結(jié)構(gòu)劃分的不合理,所以最根本的、最合理的解決方案就是重新劃分好代碼的層級(jí)結(jié)構(gòu),使其合理化,自然就規(guī)避了循環(huán)引用的麻煩。
方案二 只引用當(dāng)前的包,不引用具體的模塊
如果你的代碼是這樣,那么這種方式是會(huì)奏效的。
修改前
# 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)部
如果你的代碼是這樣,那么這種方式是會(huì)奏效的。
修改前
# 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
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
搭建python django虛擬環(huán)境完整步驟詳解
這篇文章主要介紹了搭建python django虛擬環(huán)境完整步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Python中if elif else及縮進(jìn)的使用簡述
這篇文章主要介紹了Python中if elif else及縮進(jìn)的使用,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05
python多線程實(shí)現(xiàn)代碼(模擬銀行服務(wù)操作流程)
這篇文章主要介紹了python模擬銀行服務(wù)多線程實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
Django數(shù)據(jù)庫操作之save與update的使用
這篇文章主要介紹了Django數(shù)據(jù)庫操作之save與update的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
在Python中操作MongoDB的詳細(xì)教程和案例分享
MongoDB是一個(gè)高性能、開源、無模式的文檔型數(shù)據(jù)庫,非常適合存儲(chǔ)JSON風(fēng)格的數(shù)據(jù),Python作為一種廣泛使用的編程語言,通過PyMongo庫可以方便地與MongoDB進(jìn)行交互,本文將詳細(xì)介紹如何在Python中使用PyMongo庫來操作MongoDB數(shù)據(jù)庫,需要的朋友可以參考下2024-08-08

