python - 如何编写好的/正确的包 __init__.py 文件

标签 python package

我的包有以下结构:

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__

最佳答案

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

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

我认为在 __init__.py 中使用 import * 来导入包的最有力的原因之一是能够重构已经成长为多个的脚本在不破坏现有应用程序的情况下编写脚本。但是如果你从一开始就设计一个包。我认为最好将 __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

关于python - 如何编写好的/正确的包 __init__.py 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1944569/

相关文章:

javascript - Atom 包 ternjs 出错

linux - 在 Raspberry Pi 上安装 Go 包

java - 从 Java 文件夹中导入我的类

python - 从 N 个平均值和 N 个西格玛的列表中生成 N 个样本的数组

python - 如何使用包名调用python模块

r - 跨多个工作站同步和维护相同的安装包

python - 在 Python 中从数组中删除一个字符串

python - 在 Django 模板 forloop 中迭代调用列表的索引

python - Netbeans 不允许 Python 2.6 作为默认平台(强制使用 Jython2.5)

python - 使用python作为一个 block 二进制文件旋转数组