Python中的__all__模块级变量有什么用?

29 投票
3 回答
18000 浏览
提问于 2025-04-15 18:48

我在很多Python的库源代码中见过这个东西,但我不知道它是干什么用的。

我以为它是用来限制模块中可以访问的成员的。也就是说,只有在__all__里的元素才会在执行dir(module)时显示出来。

我做了一个小例子,结果发现它并没有像我预期的那样工作。

那么,Python中的__all__这个模块级别的变量到底是用来干什么的呢?

3 个回答

4

它控制着当你使用时,你的命名空间里会引入什么内容。

from blah import *

可以查看 从包中导入所有内容 了解更多。

8

http://docs.python.org/tutorial/modules.html#importing-from-a-package

现在,假设用户写了 from sound.effects import * 这行代码。理想情况下,我们希望这个操作能够自动去文件系统中查找,看看这个包里面有哪些子模块,然后把它们都导入进来。不过,这样做可能会花费很长时间,而且导入子模块可能会引发一些不必要的副作用,这些副作用应该只在明确导入子模块时才会发生。

解决这个问题的办法就是包的作者需要提供一个明确的索引。导入语句遵循以下规则:如果一个包的 __init__.py 文件中定义了一个名为 __all__ 的列表,那么这个列表就被视为在遇到 from package import * 时应该导入的模块名称列表。保持这个列表的更新是包作者的责任,特别是在发布新版本的时候。如果包的作者觉得没有必要支持这种方式的导入,他们也可以选择不提供这个列表。

52

这个东西有两个目的:

  1. 任何阅读源代码的人都能知道公开的API是什么。虽然这并不能阻止他们去查看私有的声明,但至少给了他们一个很好的警告,不要去碰那些东西。

  2. 当你使用 from mod import * 时,只有在 __all__ 中列出的名字才会被导入。对此我认为这并不是特别重要,因为导入所有东西其实是个非常糟糕的主意。

撰写回答