簡體   English   中英

循環功能導入

[英]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('.')))

您還可以使用各種可用的軟件包來幫助導入模塊,例如impimport_file (請參閱文檔)。 或者,您可以決定使用load_source (另請參見doc: https : //docs.python.org/2/library/imp.html

暫無
暫無

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

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