2009-12-01 115 views
5

假设你有以下自包含或不包含子包?

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需要进口及其子包的护理。 我倾向于喜欢第一个(明确优于隐含),我总是使用它,但是有没有第二个优先于第一个的情况?

回答

5

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

0

__all__ = [您的增值经销商,函数,类]

使用在程序包B的__init__.py在字典上市的汽车负载的东西上面的语法。 :)