协慌网

登录 贡献 社区

有人可以在 Python 中解释__all__吗?

我越来越多地使用 Python,并且我一直看到变量__all__在不同的__init__.py文件中设置。有人可以解释这是做什么的吗?

答案

链接到,但未在此明确提及,正是在使用__all__时。它是一个字符串列表,用于定义在模块上使用from <module> import *时模块中将导出哪些符号。

例如, foo.py的以下代码显式导出符号barbaz

__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__ ,“已加星标的导入” 将导入模块中定义的所有名称(不以下划线开头)。