2010-07-17 75 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使用这种模式