2010-07-17 62 views
8

我寫了一個python包,其中包含幾個.py文件,其中包含類等。我想用「Facade」模式向客戶展示它。所以我不希望客戶學習所有的內部類,但只有通過這個API接口暴露的方法。Python中包的API。在__init__.py中?

問題是:我在哪裏放這個API?我是否在封裝內定義了一個文件api.py,或者我可以將這個API放在封裝的__init__.py中?

我解釋用一個例子

<my_module>\ 
    __init__.py 
    core.py 
    submodule1.py 
    submodule2.py 
    util.py 
    ........ 

更好,所以我在哪裏放的公共API?

回答

10

最常見的選擇是使用__init__.py - 只有在它足夠複雜以保證它(然後它不會是很多Facade ;-)的情況下,值得放棄它自己的模塊(或更多)或者更重要的是,如果您提供替代API(例如功能減少但易用性更強的簡化API,例如使用複雜的API),在這種情況下,使用單獨的模塊可以更好地組織結構。

要傳達給用戶打包,他們是應該直接導入其他模塊,請用一塊領先的下劃線命名您的「私人,內部實現模塊」:_core.py,不core.py,等等。這個約定總是在Python中用來將公共API與內部實現細節分開,並且非常值得您實現它的(非常小的)努力!

+0

你會舉一個例子嗎?我對如何做到這一點懷疑。例如:只需在__init__上輸入暴露的公共API即可。 – Renzo 2016-10-18 11:32:05

7

__init__.py文件是放置公共API或包的可接受位置,其中的其他模塊提供了實現。

3

缺點來把API爲__init__.py

  • 有引起循環依賴的危險
  • 它不是瀏覽代碼庫
時候,爲了尋找一個明顯的地方

把api放在像api.py這樣的專用模塊中可以解決這些問題。 此外,存在優點像:

  • 可以將第二模塊(簡化的,不同的用例等)在稍後提供的另一API
  • 大Python項目等Enthought traits.api和Trac trac.api使用這種模式
相關問題