要自我导入子包吗?

6 投票
2 回答
1590 浏览
提问于 2025-04-15 16:33

假设你有以下内容:

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.cb.c.d 或其他地方,那么 import b 就不应该把这些都带进来。如果真的把所有东西都带进来了,我觉得这说明最开始的命名空间划分可能就不太合理。当然,标准库里也有这样的例子(比如 import os,然后你可以使用 os.path.join 之类的),但这些都是很久以前的事情,现在基本上算是“祖传”的东西,因为那时候 Python 的打包系统还不成熟也不稳定。在新的代码中,我强烈建议一个包在你导入的时候不要把它的子包一起带上。

撰写回答