如何编写正确/正确的软件包__init__.py文件

我的软件包有以下结构:

mobilescouter/ __init__.py #1 mapper/ __init__.py #2 lxml/ __init__.py #3 vehiclemapper.py vehiclefeaturemapper.py vehiclefeaturesetmapper.py ... basemapper.py vehicle/ __init__.py #4 vehicle.py vehiclefeature.py vehiclefeaturemapper.py ... 

我不知道如何正确编写__init__.py文件。
__init__.py #1 . __init__.py #1看起来像:

 __all__ = ['mapper', 'vehicle'] import mapper import vehicle 

但是,例如__init__.py #2应该如何呢? 我的是:

 __all__ = ['basemapper', 'lxml'] from basemaper import * import lxml 

什么时候应该使用__all__

__all__非常好 – 它有助于指导导入语句,而不会自动导入模块http://docs.python.org/tutorial/modules.html#importing-from-a-package

使用__all__import *是多余的,只需要__all__

我认为在__init__.py使用import *导入包最强大的原因之一是能够重构已经成长为多个脚本的脚本,而不会破坏现有的应用程序。 但是如果你从一开始就devise一个软件包。 我认为最好将__init__.py文件留空。

例如:

 foo.py - contains classes related to foo such as fooFactory, tallFoo, shortFoo 

那么应用程序增长,现在它是一个整个文件夹

 foo/ __init__.py foofactories.py tallFoos.py shortfoos.py mediumfoos.py santaslittlehelperfoo.py superawsomefoo.py anotherfoo.py 

那么init脚本可以说

 __all__ = ['foofactories', 'tallFoos', 'shortfoos', 'medumfoos', 'santaslittlehelperfoo', 'superawsomefoo', 'anotherfoo'] # deprecated to keep older scripts who import this from breaking from foo.foofactories import fooFactory from foo.tallfoos import tallFoo from foo.shortfoos import shortFoo 

以便在更改期间写入以下内容的脚本不会中断:

 from foo import fooFactory, tallFoo, shortFoo 

我自己的__init__.py文件经常是空的。 特别是,我从来没有from blah import *作为__init__.py一部分 – 如果“导入包”意味着获取各种类,函数等直接定义为包的一部分,那么我会从词汇上复制的内容blah.py放到包的__init__.py然后删除blah.py (源文件的乘法在这里没有任何好处)。

如果你坚持支持import *成语(eek),那么使用__all__ (尽可能小的名字列表,你可以把它们放在里面)可能有助于损害控制。 一般来说,命名空间和显式导入都是东西,我强烈build议重新考虑基于系统地绕过其中一个或两个概念的方法! – )