2014-01-23 145 views
0

我在使用另一個python模塊時出現問題。用例如下:使用python模塊

請考慮以下情形。相應地評論了該錯誤。

在文件A.py:

import B 

... 
... 

在文件B.py:

import C 
import A 

c_func = C.func1() # works perfectly 
a_func = A.func2() # Error: 'module' object has no attribute 'func2' 

... 
... 

在文件C.py:

... 
... 

任何想法?提前致謝。

+1

告訴我們A.py的代碼,它定義了'func2' ... – mhlester

回答

6

這是一個循環導入。一般來說,他們不工作。

請參閱How can I have modules that mutually import each other?在FAQ中的解釋,以及解決它的一些不同方法。 Fredrik Lundh的effbot網站上還有一個Circular Imports部分。但是簡單地說:

  • A開始執行。
  • A達到import B
  • B開始執行。
  • B達到import A。由於A已經存在,這什麼都不做。無論代碼A還沒有運行 - 就像A.func2 -still的定義尚未運行。
  • B嘗試使用尚未定義的A.func2,因此會出現錯誤。

(更簡單,但不準確。B取決於A,這取決於B,這意味着B不能運行,直到B運行這可能會幫助你得到這個問題的一個直觀的瞭解,這可能幫助你理解上面的更完整/準確的解釋。)

你可能想要做什麼是AB需要移動代碼到一個單獨的模塊,這既AB可以導入,這將不再需要導入AB。這不是只有可能的解決方案(請參閱其他兩個想法的常見問題解答條目),但是如果可以乾淨地做到這一點,很難打敗它。 (沒有實際的代碼,很難給出比這更具體的答案。)

+0

但是隻要函數被調用,它就可以工作導入完成後,對不對? – mhlester

+0

@mhlester:是的。常見問題解答中提出的一種可能的解決方案是將所有'B'的頂級代碼移到一個函數中,並且只有在函數需要定義的時候才讓'A'調用該函數。另一個可能的解決方案是將'import B'向下移動到'A'中,直到'func2'被定義爲止。 – abarnert

+0

@abarnert:非常感謝您的解釋。我知道了.. –