python中包的API.在__init__.py?

pie*_*lli 8 python

我编写了一个python包,它包含几个.py包含类等的文件.我想使用"Facade"模式将其公开给客户端.所以我不希望客户端学习所有内部类,只需要学习这个API接口公开的方法.

问题是:我在哪里放这个api?我是否api.py在包中定义了一个文件,或者我可以将这个api放在__init__.py包中吗?

我用一个例子来解释得更好

<my_module>\
     __init__.py
     core.py
     submodule1.py
     submodule2.py
     util.py
     ........
Run Code Online (Sandbox Code Playgroud)

那么我在哪里放置公共API?

Ale*_*lli 10

最常见的选择是使用__init__.py- 只有当它足够复杂以保证它时才值得用它自己(或更多)的模块(然后它不会是一个Facade ;-),或者更重要的是,如果您提供替代API(例如,简化的API具有减少的功能但更易于使用,以及丰富/复杂的API),在这种情况下使用单独的模块可以使事情更好地组织.

传达给包他们的用户应该直接导入其他模块,请用一块命名你的"私人,内部执行模块" 前导下划线:_core.pycore.py,等等.这个约定总是在Python中用于将公共API与内部实现细节分开,并且非常值得(实际上很小的)努力实现它!


Ign*_*ams 7

__init__.py文件是放置公共API或包的可接受位置,其中的其他模块提供实现.


Ber*_*ler 6

将 api 放入有以下缺点__init__.py

  • 存在导致循环依赖的危险
  • 浏览代码库时,这不是一个明显的地方

将 api 放在像 api.py 这样的专用模块中会提升这些问题。此外,还有以下优点

  • 您可以稍后在第二个模块中提供另一个 api(简化的、不同的用例等)
  • 像 Enthought traits.api和 Trac trac.api这样的大型 Python 项目使用这种模式