有人可以解释
我一直在使用Python越来越多,我一直看到变量__all__
设置在不同的__init__.py
文件中。 有人可以解释这是什么吗?
它是该模块的公共对象列表,由import *
解释。 它将覆盖隐藏以下划线开头的所有内容的默认值。
链接到,但这里没有明确提到,正是使用__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>
。
我只是补充一点:
所有其他答案都是指模块。 原始问题在__init__.py
文件中明确提到了__all__
,所以这是关于python包的。
通常, __all__
仅在使用import
语句的from xxx import *
变体时才起作用。 这适用于包和模块。
其他答案解释了模块的行为。 这里详细描述包的确切行为。
简而言之,包级别的__all__
与模块大致相同,除了处理包中的模块(与在模块中指定名称相反)。 所以__all__
指定当我们使用from package import *
时应该加载并导入到当前命名空间的所有模块。
最大的区别在于,当您在程序包的__init__.py
省略__all__
的声明时, from package import *
的语句根本不会导入任何内容(文档中有例外,请参阅上面的链接)。
另一方面,如果在模块中省略__all__
,则“星号导入”将导入模块中定义的所有名称(不以下划线开头)。
上一篇: Can someone explain