假设您有以下
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.c
或from 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
负责导入其子包。
我倾向于选择第一个(显式优于隐式),而且我总是使用它,但是有没有第二个优先于第一个的情况?
答案 0 :(得分:5)
我喜欢名称空间 - 所以我认为import b
只能获得b
本身的内容(大概在b/__init__.py
中)。如果有理由在b.c
,b.c.d
或其他任何内容中分隔其他功能,那么只有import b
不应该全部拖入 - 如果“全部拖入”确实发生了,我认为这表明命名空间分离可能是一个虚假的开始。当然,即使在标准库中也有一些例子(import os
,然后你可以使用os.path.join
之类的东西),但是它们很古老,现在基本上是“蛮横”的东西,从Python之前开始包装系统成熟稳定。在新代码中,我强烈建议在导入时不将其子包拖动到其中。 (在Python提示符处import this
并考虑它显示的最后一行; - )。
答案 1 :(得分:0)
__all__
= [你的vars,函数,类]
使用包b的__init__.py
上面的语法自动加载dict中列出的内容。 :)