问题描述
我的包有以下结构:
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 看起来像:
I'm not sure how the __init__.py files should be correctly written.
The __init__.py #1 looks like:
__all__ = ['mapper', 'vehicle'] import mapper import vehicle
但是例如 __init__.py #2 应该是什么样子?我的是:
But how should for example __init__.py #2 look like? Mine is:
__all__ = ['basemapper', 'lxml'] from basemaper import * import lxml
什么时候应该使用 __all__?
推荐答案
__all__ 非常好 - 它有助于指导导入语句而不自动导入模块http://docs.python.org/tutorial/modules.html#importing-from-a-package
__all__ is very good - it helps guide import statements without automatically importing modules http://docs.python.org/tutorial/modules.html#importing-from-a-package
使用 __all__ 和 import * 是多余的,只需要 __all__
using __all__ and import * is redundant, only __all__ is needed
我认为在 __init__.py 中使用 import * 来导入包的最有力的原因之一是能够重构已经成长为多个的脚本在不破坏现有应用程序的情况下编写脚本.但是如果你从一开始就设计一个包.我认为最好将 __init__.py 文件留空.
I think one of the most powerful reasons to use import * in an __init__.py to import packages is to be able to refactor a script that has grown into multiple scripts without breaking an existing application. But if you're designing a package from the start. I think it's best to leave __init__.py files empty.
例如:
foo.py - contains classes related to foo such as fooFactory, tallFoo, shortFoo
然后应用程序增长,现在它是一个完整的文件夹
then the app grows and now it's a whole folder
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
以便为执行以下操作而编写的脚本在更改期间不会中断:
so that a script written to do the following does not break during the change:
from foo import fooFactory, tallFoo, shortFoo