簡體   English   中英

模塊命名空間中提供的Python Import Statement和Recursion-need函數

[英]Python Import Statement and Recursion- need function available in module namespace

我在main.py中有函數foo()。 在main.py中,我導入create.py。 但是create.py中有一個函數需要來自main的foo()。 我無法將main.py導入到create.py中,因為main.py出錯...我認為這是某種競爭條件。

如何在create.py命名空間中使foo()可用? 將foo()作為模塊並由main.py和create.py導入僅用於一個函數似乎效率低下。

簡單的答案是將foo()移動到foo.py並從那里導入或將其移動到create.py並將其從那里導入main.py - 如果main.py中有東西它也需要移動。 您的另一個選擇是將foo從main傳遞到create作為需要它的函數參數。

只是一個簡單的黑客,但這在一般情況下無濟於事。

在main.py進口create.py當它通過導入調用。

# in main.py
if __name__ == '__main__':
    from create import *

因此,當你通過python main.py將導入create並且將導入create並且它將再次導入main,但這次,它將看到它被導入,因此__name__ == '__main__'將返回False 因此循環的進口鏈將停止。

請記住,當您嘗試在其他腳本中導入main.py時, 它將無法工作 ,因為create.py將不會導入。

所以要使這個東西工作,你必須執行main.py,你不能導入它。

導入模塊時,Python的import機制會執行該模塊的代碼來填充它,但只能執行一次。 如果多次導入同一模塊,則會從sys.modules緩存中獲取它。 沒有辦法結束無限導入循環。

但是,Python在為其執行代碼之前將模塊添加到sys.modules ,因此在整個模塊執行之前,它不會完全填充。 因此,如果模塊A導入模塊B,模塊B再次導入模塊A,它將看到部分初始化的模塊。 這似乎是在這里發生的事情; main導入在完全填充之前create ,因此當create嘗試訪問main某些內容時,它還不存在。

一些解決方案

  1. 如上所述,將共享代碼移動到單獨的模塊。 導入只進行一次,Python在PYC文件中緩存已編譯的字節代碼,因此實際上並不是那么昂貴。
  2. 將所有代碼移動到函數中,並在任何地方使用import name (不from name import ),並從腳本底部調用main函數。 這樣,在執行任何其他操作之前,所有模塊都將完成導入。
  3. import create語句向下移動到您需要訪問的函數下方,因此在執行create.py的代碼之前定義它(這有點傻,但可以作為最后的手段使用)。

暫無
暫無

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

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