python中包的API。在__init__.py?

时间:2010-07-17 14:09:08

标签: python

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

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

我用一个例子更好地解释

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

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

3 个答案:

答案 0 :(得分:10)

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

要与包装用户沟通他们应该直接导入其他模块,请务必使用前导下划线命名您的“私有内部实施模块”_core.py,而不是core.py,依此类推。这个约定总是在Python中用于将公共API与内部实现细节分开,非常值得(实际上很小的)努力实现它!

答案 1 :(得分:7)

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

答案 2 :(得分:4)

将api放入__init__.py

缺点
  • 存在导致骑车依赖的危险
  • 在浏览代码库时,它不是一个显而易见的地方

将api放在像api.py这样的专用模块中可以解决这些问题。 此外,还有优点,如:

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