是否自行导入子包?

时间:2009-12-01 04:29:44

标签: python packages

假设您有以下

b
b/__init__.py
b/c
b/c/__init__.py
b/c/d
b/c/d/__init__.py

在某些python包中,如果你import b,你只能得到b中定义的符号。要访问b.c,您必须明确import b.cfrom b import c。换句话说,你必须

import b
import b.c
import b.c.d
print b.c.d

在其他情况下,我看到了所有子包的自动导入。这意味着以下代码不会产生错误

import b
print b.c.d

因为b/__init__.py负责导入其子包。 我倾向于选择第一个(显式优于隐式),而且我总是使用它,但是有没有第二个优先于第一个的情况?

2 个答案:

答案 0 :(得分:5)

我喜欢名称空间 - 所以我认为import b只能获得b本身的内容(大概在b/__init__.py中)。如果有理由在b.cb.c.d或其他任何内容中分隔其他功能,那么只有import b不应该全部拖入 - 如果“全部拖入”确实发生了,我认为这表明命名空间分离可能是一个虚假的开始。当然,即使在标准库中也有一些例子(import os,然后你可以使用os.path.join之类的东西),但是它们很古老,现在基本上是“蛮横”的东西,从Python之前开始包装系统成熟稳定。在新代码中,我强烈建议在导入时将其子包拖动到其中。 (在Python提示符处import this并考虑它显示的最后一行; - )。

答案 1 :(得分:0)

__all__ = [你的vars,函数,类]

使用包b的__init__.py上面的语法自动加载dict中列出的内容。 :)