问题:如何编写良好/正确的__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
样子:
__all__ = ['mapper', 'vehicle']
import mapper
import vehicle
但是例如应该__init__.py #2
看起来如何?我的是:
__all__ = ['basemapper', 'lxml']
from basemaper import *
import lxml
什么时候应该__all__
使用?
回答 0
__all__
很好-它有助于指导导入语句,而无需自动导入模块
http://docs.python.org/tutorial/modules.html#importing-from-a-package
使用__all__
和import *
是多余的,仅__all__
需要
我认为import *
在__init__.py
导入软件包中使用的最有力的理由之一是能够重构已经成长为多个脚本的脚本,而又不会破坏现有的应用程序。但是,如果您从一开始就设计一个包装。我认为最好将__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
然后初始化脚本可以说
__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
回答 1
我自己的__init__.py
文件经常为空。特别是,我从来没有加入from blah import *
过__init__.py
-如果“导入包”意味着直接将各种类,函数等定义为包的一部分,那么我将以词法将其内容复制blah.py
到包的内容中__init__.py
并删除blah.py
(源文件的乘法在这里没有好处)。
如果您确实坚持支持import *
惯用语(eek),那么使用__all__
(尽量减少使用姓名列表)可能会有助于控制损失。通常,命名空间和显式导入是一件好事,我强烈建议您重新考虑基于系统地绕过一个或两个概念的任何方法!
回答 2
你的 __init__.py
应该有一个文档字符串。
尽管所有功能都在模块和子程序包中实现,但您的程序包docstring是记录从何开始的地方。例如,考虑 python email
软件包。软件包文档是介绍性的介绍,描述了目的,背景以及软件包中各个组件如何协同工作。如果您使用sphinx或其他软件包从文档字符串自动生成文档,则文档字符串正是描述此类介绍的正确位置。
有关其他任何内容,请参阅firecrow和Alex Martelli的出色回答。