要自我导入子包吗?
假设你有以下内容:
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
负责导入它的子包。我个人更喜欢第一种方式(显式导入比隐式导入要好),我一直都是这样做的,但有没有情况下第二种方式比第一种更好呢?
2 个回答
-1
__all__
是一个列表,里面可以放你想要公开的变量、函数和类。
在包 b 的 __init__.py
文件中使用上面的写法,可以自动加载列表里列出的内容。这样做很方便哦!
5
我喜欢命名空间,所以我觉得 import b
应该只引入 b
里面的内容(大概是在 b/__init__.py
里)。如果有理由把其他功能放在 b.c
、b.c.d
或其他地方,那么 import b
就不应该把这些都带进来。如果真的把所有东西都带进来了,我觉得这说明最开始的命名空间划分可能就不太合理。当然,标准库里也有这样的例子(比如 import os
,然后你可以使用 os.path.join
之类的),但这些都是很久以前的事情,现在基本上算是“祖传”的东西,因为那时候 Python 的打包系统还不成熟也不稳定。在新的代码中,我强烈建议一个包在你导入的时候不要把它的子包一起带上。