我为什么要在__init__的python包中使用__all__?

时间:2015-06-17 10:17:55

标签: python package

我已经阅读了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位于命名空间中,但A1b不在。我为什么要定义__all__ = ["A"]

1 个答案:

答案 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中导入的所有内容。