如何编写正确/正确的软件包__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议重新考虑基于系统地绕过其中一个或两个概念的方法! – )