2013-07-21 57 views
1

我在main.py中有函數foo()。在main.py中,我導入了create.py。但是create.py中有一個函數需要main的foo()。我無法將main.py導入到create.py中,因爲main.py出錯......我認爲這是某種競爭條件。模塊命名空間中的Python導入語句和遞歸需要函數

如何在create.py命名空間中創建foo()?使用foo()模塊並且僅爲一個函數使用main.py和create.py導入它似乎效率低下。

+1

人,即開始導入主。py,create.py無限次。我敢打賭,爲foo()創建一個額外的模塊並通過main.py和create.py導入它是唯一的解決方案。 – rnbcoder

回答

1

最簡單的答案是從那裏移動FOO()來foo.py改爲進口或將它移動到create.py,並從那裏將它導入到main.py - 如果有東西在main.py,它需要移動也是。你的另一個選擇是將foo從main傳入到需要的地方作爲函數參數創建。

1

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

在main.py中導入create.py時,它是不是通過導入調用。

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

因此,這將導入當您通過python main.py EXCUTE main.py創建和將導入創建,它會再次導入主,但這個時候,它會看到它正在導入這樣__name__ == '__main__'將返回False。所以導入的循環鏈將停止。

記住,它不會工作當您嘗試在其他腳本中導入main.py時,因爲create.py不會被導入。

因此,爲了使這個東西的工作,你必須執行main.py,您不能導入它。

1

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

但是,Python在爲其執行代碼之前將該模塊添加到sys.modules,因此在整個模塊執行完畢之前它不會被完全填充。因此,如果模塊A導入模塊B,並且模塊B再次導入模塊A,它將看到一個部分初始化的模塊。這似乎是在這裏發生的事情; main進口create它完全填充之前,所以當create試圖在main訪問的東西,它還不存在。

一些解決方案:

  1. 移動共享代碼到一個單獨的模塊,如上面所建議的。導入只進行一次,並且Python在PYC文件中緩存編譯字節碼,所以它並不是那麼昂貴。
  2. 全部移動代碼到功能,並使用import name無處不在(無from name import),並從腳本的底部打電話給你的主要功能。這樣,所有模塊將在執行其他任何事情之前完成導入。
  3. import create語句向下移動到您需要訪問的函數的下方,因此它在執行create.py代碼之前定義(這是一種愚蠢的行爲,但可用作最後的手段)。