`__all__` 控制被导入的内容

对从模块或包导出的符号进行精确控制

问题

当使用from module import * 语句时,希望对从模块或包导出的符号进行精确控制。

解决方案

在你的模块中定义一个变量 __all__ 来明确地列出需要导出的内容,也就是模块中公开的成员。

举个例子:

 1# somemodule.py
 2def spam():
 3    pass
 4
 5def grok():
 6    pass
 7
 8blah = 42
 9# Only export 'spam'
10__all__ = ['spam']

尽管强烈反对使用 from module import * 但是在定义了大量变量名的模块中频繁使用。

  • 如果你不做任何事, 这样的导入将会导入所有不以下划线开头的。
  • 如果定义了 all , 那么只有被列举出的东西会被导出。
  • 如果你将 all 定义成一个空列表, 没有东西将被导入。
  • 如果 all 包含未定义的名字, 在导入时引起AttributeError。

Note: 在 Python 中,__all__ 是一个特殊的变量,用于定义一个模块中应该被导出的公共接口(即可供其他模块使用的内容)。它是一个包含字符串的列表,表示该模块中可以被导入的符号(变量、函数、类等)。

为什么在 __all__ 中使用字符串呢?

这是因为 __all__ 中的字符串代表的是模块中的名称,而不是变量本身。当我们导入一个模块时,我们使用的是模块的名称,而不是模块中定义的变量的名称。