有人可以解释

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


它是该模块的公共对象列表,由import *解释。 它将覆盖隐藏以下划线开头的所有内容的默认值。


链接到,但这里没有明确提到,正是使用__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>


我只是补充一点:

所有其他答案都是指模块。 原始问题在__init__.py文件中明确提到了__all__ ,所以这是关于python包的。

通常, __all__仅在使用import语句的from xxx import *变体时才起作用。 这适用于包和模块。

其他答案解释了模块的行为。 这里详细描述包的确切行为。

简而言之,包级别的__all__与模块大致相同,除了处理包中的模块(与在模块中指定名称相反)。 所以__all__指定当我们使用from package import *时应该加载并导入到当前命名空间的所有模块。

最大的区别在于,当您在程序包的__init__.py省略__all__的声明时, from package import *的语句根本不会导入任何内容(文档中有例外,请参阅上面的链接)。

另一方面,如果在模块中省略__all__ ,则“星号导入”将导入模块中定义的所有名称(不以下划线开头)。

链接地址: http://www.djcxy.com/p/53437.html

上一篇: Can someone explain

下一篇: R foreach: from single