2016-07-08 48 views
2

假設您正在創建一個包含四個子包的python包,並且有一個模塊generic_stuff.py,這正好是其中兩個所需的模塊。爲了使其具有實際意義,可能generic_stuff.py包含一些用於讀取和寫入數據庫的自定義函數,並且子包1和2包含用於要單獨部署的Web服務器的代碼。在子包之間共享Python模塊的最佳做法是什麼?

的問題是:

什麼是正確的方式使generic_stuff.py提供給子包1和2?

我能想到的三種方式來做到這一點,但他們都覺得像黑客:

  1. 請自行封裝generic_stuff.py一部分並進行安裝。這是不令人滿意的,因爲它污染了整個系統的命名空間(更不用說子包3和4)。
  2. 將子目錄(包含generic_stuff.py和四個子包)添加到系統路徑中,然後再導入到子包1和子包2中。這並不令人滿意,因爲它將父目錄中的所有內容添加到子包1和2的名稱空間中。通過將generic_stuff.py放在其自己的目錄中並將其添加到系統路徑中可以避免,但即使如此,如果在子包1和2中有多個模塊正在使用多個通用模塊,這種方法的擴展性也不會很好(假設嘗試重構該項目)。
  3. 維護generic_stuff.py的兩個副本:分包1和分包2中的一個。我是否需要解釋爲什麼這是一個壞主意?

我想什麼,我心裏有一些類型的配置,也許這​​將走在父目錄的__init__.py或東西,這將使模塊X提供給​​分裝Y.是否像這樣的東西存在嗎?

回答

1

也許我是某個東西,但看起來好像你是在解決問題。只需將generic_stuff.py放在包裝的最高級別,並將其導入sub1和sub2。你可以使用絕對或相對導入,沒有名稱污染不會與sys.path混淆。例如:

包裝結構:

package 
|-- generic_stuff.py 
|-- __init__.py 
|-- sub1 
| |-- __init__.py 
| `-- sub1_module.py 
|-- sub2 
| `-- __init__.py 
|-- sub3 
| `-- __init__.py 
`-- sub4 
    `-- __init__.py 

在需要generic_stuff做的所有模塊是這樣的:

# sub1_module.py 
# import using a relative reference 
import ..generic_stuff as gs 
gs.some_tool() 
# or an absolute reference 
from package import generic_stuff as gs 
gs.some_tool() 
相關問題