我已经阅读了Can someone explain __all__ in Python?,我知道它只会影响from ... import *
语句,但我无法弄清楚一个真实的用例。当我可以简单地避免在__all__
命名空间中导入这些名称时,为什么要在__init__
(DRY!)中重复导出的名称?
示例:
mypackage/__init__.py
from a import A
mypackage/a.py
A = "A"
A1 = "A1"
mypackage/b.py
B = "B"
然后在python中:
>>> from mypackage import *
>>> A
'A'
>>>
>>> A1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'A1' is not defined
>>> b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
正如您所看到的,A
位于命名空间中,但A1
和b
不在。我为什么要定义__all__ = ["A"]
?
答案 0 :(得分:6)
您要在程序包__all__
中定义__init__.py
的仅时间列出了当用户执行时要导出的“导出”成员的名称:
from package import *
6.4.1. Importing * From a Package
中记录了这一点 注意:如果你不在你的包中定义__all__
,那么默认行为如下(来自文档):
如果未定义
__all__
,则声音来自sound.effects import * 不会将包声音中的所有子模块导入到 当前命名空间它只能确保包sound.effects有 已导入(可能正在运行任何初始化代码__init__.py
)然后导入包中定义的任何名称。这包括定义的任何名称(和子模块显式 由__init__.py
加载)。它还包括包的任何子模块 由以前的import语句显式加载的。考虑 这段代码:
对此的“天真”解释可以是:
如果你没有定义
__all__
;from package import *
会带来该套餐中的所有内容以及 pacakge__init__.py
中导入的所有内容。