链接到,但未在此明确提及,正是在使用__all__
时。它是一个字符串列表,用于定义在模块上使用from <module> import *
时模块中将导出哪些符号。
例如, foo.py
的以下代码显式导出符号bar
和baz
:
__all__ = ['bar', 'baz']
waz = 5
bar = 10
def baz(): return 'baz'
然后可以像这样导入这些符号:
from foo import *
print bar
print baz
# The following will trigger an exception, as "waz" is not exported by the module
print waz
如果上面的__all__
被注释掉,则此代码将执行完成,因为import *
的默认行为是从给定的命名空间导入所有不以下划线开头的符号。
参考: https : //docs.python.org/3.5/tutorial/modules.html#importing-from-a-package
注意: __all__
影响from <module> import *
行为。 __all__
中未提及的成员仍可从模块外部访问,可以from <module> import <member>
。
它是该模块的公共对象列表,由import *
解释。它会覆盖隐藏以下划线开头的所有内容的默认设置。
我只是简单地添加这个:
所有其他答案都参考模块 。最初的问题在__init__.py
文件中明确提到了__all__
,所以这是关于 python 包的 。
通常, __all__
仅在使用import
语句的from xxx import *
变体时才起作用。这适用于包和模块。
其他答案中解释了模块的行为。 这里详细描述了包的确切行为。
简而言之,包级别上的__all__
与模块大致相同,只是它处理包中的模块 (与在模块中指定名称相反)。所以__all__
指定当我们from package import *
使用时应加载并导入当前命名空间的所有模块。
最大的区别是,当你在包的__init__.py
省略 __all__
的声明时from package import *
的语句根本不会导入任何内容(文档中有例外,请参见上面的链接)。
另一方面,如果在模块中省略__all__
,“已加星标的导入” 将导入模块中定义的所有名称(不以下划线开头)。