Python中的__all__模块级变量有什么用?
我在很多Python的库源代码中见过这个东西,但我不知道它是干什么用的。
我以为它是用来限制模块中可以访问的成员的。也就是说,只有在__all__
里的元素才会在执行dir(module)
时显示出来。
我做了一个小例子,结果发现它并没有像我预期的那样工作。
那么,Python中的__all__
这个模块级别的变量到底是用来干什么的呢?
3 个回答
4
8
http://docs.python.org/tutorial/modules.html#importing-from-a-package
现在,假设用户写了
from sound.effects import *
这行代码。理想情况下,我们希望这个操作能够自动去文件系统中查找,看看这个包里面有哪些子模块,然后把它们都导入进来。不过,这样做可能会花费很长时间,而且导入子模块可能会引发一些不必要的副作用,这些副作用应该只在明确导入子模块时才会发生。解决这个问题的办法就是包的作者需要提供一个明确的索引。导入语句遵循以下规则:如果一个包的
__init__.py
文件中定义了一个名为__all__
的列表,那么这个列表就被视为在遇到from package import *
时应该导入的模块名称列表。保持这个列表的更新是包作者的责任,特别是在发布新版本的时候。如果包的作者觉得没有必要支持这种方式的导入,他们也可以选择不提供这个列表。
52
这个东西有两个目的:
任何阅读源代码的人都能知道公开的API是什么。虽然这并不能阻止他们去查看私有的声明,但至少给了他们一个很好的警告,不要去碰那些东西。
当你使用
from mod import *
时,只有在__all__
中列出的名字才会被导入。对此我认为这并不是特别重要,因为导入所有东西其实是个非常糟糕的主意。