溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

解決python循環(huán)引用報(bào)錯(cuò)的方法

發(fā)布時(shí)間:2020-08-05 17:21:17 來源:億速云 閱讀:230 作者:小新 欄目:編程語言

小編給大家分享一下解決python循環(huán)引用報(bào)錯(cuò)的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

最近在開發(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。

解決方案

方案一、合理劃分項(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

看完了這篇文章,相信你對(duì)解決python循環(huán)引用報(bào)錯(cuò)的方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI