91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中循環引用import失敗怎么辦

發布時間:2021-07-13 10:36:53 來源:億速云 閱讀:187 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Python中循環引用import失敗怎么辦的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

前言

最近在開發智能家居項目hestia-rpi項目中,由于代碼結構層級劃分不合理,導致了循環引用(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第一次執行,需要執行from A import ,發現沒有A,就新建一個A在內存中,然后填充A模塊的信息,就會去執行A,此時,A里面要 from Main import D,那么因為Main已被執行,就直接從內存的map中取得Main的信息,不過此時Main的信息還沒有填充完,因為之前就是為了填充才轉到A的,這時從已有的空的Main中拿不到D,就會報錯,ImportError。

來自:https://www.jb51.net/article/138673.htm

解決方案

方案一 合理劃分項目代碼層級

循環引用最大的本質問題是代碼層級結構劃分的不合理,所以最根本的、最合理的解決方案就是重新劃分好代碼的層級結構,使其合理化,自然就規避了循環引用的麻煩。

方案二 只引用當前的包,不引用具體的模塊

如果你的代碼是這樣,那么這種方式是會奏效的。

修改前

# 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

方案二 將引用放到函數內部

如果你的代碼是這樣,那么這種方式是會奏效的。

修改前

# 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中循環引用import失敗怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清流县| 尚义县| 高淳县| 镶黄旗| 汉沽区| 铜川市| 大田县| 渭源县| 清水河县| 兴安县| 西乡县| 包头市| 永德县| 昌黎县| 龙游县| 临沂市| 凤台县| 杭锦后旗| 建瓯市| 肥西县| 凌源市| 东乡县| 克山县| 西青区| 昭通市| 西华县| 河津市| 新巴尔虎右旗| 哈密市| 通城县| 游戏| 谷城县| 三都| 巢湖市| 广东省| 白山市| 泸溪县| 花莲县| 新民市| 黄石市| 蕉岭县|