簡體   English   中英

處理Python模塊中的循環依賴項?

[英]Handle circular dependencies in Python modules?

這是一個案例,我在圈子里跑來跑去,我即將瘋狂。

我希望Python首先分析所有文件,以便從一開始就知道所有標識符(我認為像Java一樣)。

我有一個“main.py”和一個“gui.py”。 每個文件都包含一個類,該類使用另一個文件中的類。 當我嘗試運行“main.py”時,解釋器導入“gui”,然后在“gui.py”中導入“main”,然后它處理整個主模塊並說:“Tee-hee,沒有類在gui.py中使用給定的名稱。“

我該如何處理在Python循環依賴以最小的大驚小怪

我以為我會把它擴展成答案而不是評論。

值得注意的是, 循環導入通常是設計糟糕的標志 :為什么不改變設計,而不是要求語言適合您的設計?

python中存在解決此問題的方法

  • 好的選擇:重構你的代碼不要使用循環導入。
  • 錯誤選項:將一個import語句移動到另一個范圍。

但不,你不能預先解析文件。 這不是Python的工作方式,如果你研究一下Python是如何工作的,那很明顯。

如果無法避免循環導入,請將其中一個導入移出模塊級作用域,然后移動到使用它的方法/函數中。

filea.py

import fileb

def filea_thing():
    return "Hello"

def other_thing():
    return fileb_thing()[:10]

fileb.py

def fileb_thing():
    import filea
    return filea.filea_thing() + " everyone."

這樣,filea只會在你調用fileb_thing()時導入,然后重新導入fileb,但由於fileb_thing在那時沒有被調用,所以你不會繼續循環。

正如其他人所指出的那樣,這是一種代碼味道,但有時你需要做一些事情,即使它很難看。

通常,依賴項應該是樹。 循環依賴項無法解析。

但是,解決此問題的常用方法是在全局命名空間以外的級別對所需模塊進行“本地導入”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM