__all__ 是导入的简写吗? [复制]
Posted
技术标签:
【中文标题】__all__ 是导入的简写吗? [复制]【英文标题】:Is __all__ a shorthand for import? [duplicate] 【发布时间】:2020-02-04 05:11:25 【问题描述】:Python包初始化文件可以有变量__all__
列出使用时要导入的子包:from package import *
这是否与在 init 文件中写入导入子包名称(而不是 __all__
)相同?
我读过一篇文章说如果包目录中的 init.py 文件包含一个名为 all 的列表,它被认为是一个模块列表,应该当遇到 import * 的语句时被导入。
【问题讨论】:
__all__
旨在列出模块中的“导出名称”。它不会触发子包的导入
@Anthony - 一篇在线文章说 - 如果包目录中的 init.py 文件包含一个名为 all 的列表,则将其带到是遇到 __all__
对单个源文件比对__init__.py
文件更有用。在此类__init__.py
文件中,您通常已经仅导入您打算从包外部提供的变量和函数。例如:
package foo
+-- __init__.py
+-- bar.py
+-- baz.py
__init__.py
from .bar import *
from .baz import *
bar.py
def some_method():
...
def other_method():
...
def hidden_method():
...
class some_class:
...
__all__ = ['some_method', 'other_method', 'some_class']
然后在包外,
import foo
foo.some_method() # works
foo.other_method() # works
foo.hidden_method() # error
【讨论】:
这是一个非常直观的答案:) 你能告诉我 all 在包的 init 文件中起到什么作用吗?和模块中的一样吗? @variable__init__.py
实际上就像任何其他 python 源文件一样,除了它是在您尝试导入整个文件夹时隐式导入的。从技术上讲,您可以将所有代码都写在 __init__.py
文件中,在这种情况下,您可能希望在其中放置一个 __all__
变量以限制其他人从其中导入的内容。与任何其他源文件一样。这里的区别在于__init__.py
通常不以这种方式使用,因此__all__
通常在其中没有用处。
好的,所以 all 中不应该有模块名称,因为这样做是无效的。
Foll 是一篇在线文章,与您的答案不同。如果 package 目录下的 init.py 文件包含一个名为 all 的列表,则当 from 以上是关于__all__ 是导入的简写吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
__all__ 在 __init__.py 中不生效? [复制]