__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 的列表,则将其带到是遇到 import * 语句时应导入的模块列表。 【参考方案1】:

__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 的语句时,它被认为是应该导入的模块列表遇到 import *。

以上是关于__all__ 是导入的简写吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

__all__ 在 __init__.py 中不生效? [复制]

导入是在 main 函数还是 if 语句中? [复制]

我可以为类而不是实例定义 __repr__ 吗? [复制]

$_SERVER['REMOTE_ADDR'] 可信吗? [复制]

您可以进行 $_POST 变量吗? [复制]

导入基本部分 scss 时避免复制 [重复]