我一直在嘗試像這樣的層次結構的各種用法以及絕對導入和相對導入之間的差異,並且無法弄清楚如何在沒有簡單的情況下對包,子包和模塊執行常規操作把所有東西放在sys.path中。我有一個雙級封裝層次:在Python 3中測試子包模塊
MyApp __init__.py Application __init__.py Module1 Module2 ... Domain __init__.py Module1 Module2 ... UI __init__.py Module1 Module2 ...
我希望能夠做到以下幾點:在一個模塊的「如果主要」的模塊導入時,從其他
- 運行測試代碼模塊在同一個目錄中。
- 在每個子包中有一個或多個測試代碼模塊,用於對子包中的模塊執行單元測試。
- 有一組單元測試,它們位於某個合理的位置,但位於子包之外,可以位於兄弟包,頂層包或頂層包之外(儘管所有這些最終都可能在運行在每個子包中的測試)
- 從三個子包級別中的任何一個「輸入」結構,例如運行僅使用域模塊的代碼,運行僅使用應用程序模塊的代碼,但Application使用來自應用程序和域模塊的代碼,並且從GUI運行代碼使用來自GUI和應用程序的代碼;例如,應用程序測試代碼將導入應用程序模塊,但不導入域模塊。
- 在沒有子包的情況下開發大量代碼之後,在將模塊組織到此層次結構中之後繼續開發和測試。
我知道如何使用相對導入,使得把MyApp的它的sys.path外部代碼可以導入MyApp的,進口從他們的模塊,它希望所有的子包,和進口的東西,而在各子包模塊可以導入來自相同子包或兄弟包的其他模塊。然而,上面列出的開發需求似乎與子包構造不兼容 - 換句話說,我不能用兩種方法:一種從外部使用並且在內部使用的結構良好的多層包體系,特別是用於測試而且還因爲來自一個設計級別(尤其是UI)的模塊不應該從下一個設計級別的設計級別導入模塊。
對不起長篇大論,但我認爲它代表了許多人已經採用新的相對進口機制的鬥爭。
模塊可以相對彼此引用之前,必須有絕對導入。 Application模塊中的程序test.py不能從.module1中導入,也不能從..Domain.Module2中導入:我會得到「嘗試在非包中導入相對」錯誤。我能做的最好的做法是讓測試代碼將'..'添加到sys.path中,並通過引用Application來完成它的導入。Module1等。在導入的應用程序中,Module1可以從.Module2導入。但是,這些都不能引用..domain.Module1。要做到這一點,test.py必須將../ ..放在路徑上並從MyApp.Application導入。 – 2009-12-30 15:39:35
爲什麼你不想首先使用絕對導入?他們非常好。 – 2009-12-30 21:31:32
因爲例如在開發過程中,我想快速測試一個子模塊,所以我直接在子模塊中進行測試。 不,相對導入不允許與絕對導入完全相同的東西:在子包中運行腳本,並且無法通過相對導入來訪問頂層包。 – Turion 2012-02-11 23:29:06