[英]Circular function import
我正在嘗試在python 2.6中執行以下操作。
my_module.py:-
from another_module import another_factory
def my_factory(name):
pass
another_module.py:-
from my_module import my_factory
def another_factory(name):
pass
兩個模塊在同一文件夾中。
它給了我錯誤:
Error: cannot import name my_factory
從評論中可以看出,您正在嘗試進行不可能的圓導入。
如果在模塊A中嘗試從模塊B導入某些內容,並且在加載模塊B(以滿足這種依賴性)時嘗試從模塊A導入某些內容,那么您就是從這里開始的,並且您可以進行圓導入: A需要B,而B需要A !!,這有點像說A需要A,這是很不合邏輯的。
例如:
# moduleA
from moduleB import functionB
...
因此,解釋器嘗試加載moduleB,如下所示:
# moduleB
from moduleA import functionA
...
並返回到moduleA,再次嘗試導入B,依此類推。因此python只會引發錯誤並停止精神錯亂,從而帶來更大的好處。
依賴關系不能這樣工作。 定義需要另一個模塊的模塊,然后執行簡單的導入。 在您的示例中,似乎another_module
需要my_module
,因此請更改my_module
並消除對another_module
的依賴。
如果兩個模塊實際上確實需要彼此,則很明顯地表明它們屬於同一邏輯概念,應該合並。
PD:在某些情況下,為避免龐大的文件,您可以將邏輯單元一分為二,並且為了避免與圓相關,可以在函數內部(在加載時不執行)中編寫導入,這樣就不會出現圈。 但是,通常應避免這種情況。
真正的問題是...您是否將每個文件都視為一個模塊,或者它們是包的一部分?
嘗試將模塊導入軟件包外部有時很痛苦。 您應該只在目錄中創建一個空的__init__.py模塊來構建軟件包。 雖然,如果你有
__init__.py
my_module.py
another_module.py
如果您在my_module.py中具有以下功能,
def my_factory(x):
return x * x
通過編寫以下代碼,您應該能夠從another_module.py訪問my_factory()函數:
from my_module import my_factory
但是,如果您沒有__init__.py文件/模塊,則導入功能將(以某種方式)丟失,並且僅使用sys.path搜索其他模塊。 然后,您可以在another_module.py文件中(在import之前)添加以下行:
sys.path.append(os.path.dirname(os.path.expanduser('.')))
您還可以使用各種可用的軟件包來幫助導入模塊,例如imp或import_file (請參閱文檔)。 或者,您可以決定使用load_source (另請參見doc: https : //docs.python.org/2/library/imp.html )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.