【问题标题】:Is __all__ a shorthand for import? [duplicate]__all__ 是导入的简写吗? [复制]
【发布时间】:2020-02-04 05:11:25
【问题描述】:

Python包初始化文件可以有变量__all__列出使用时要导入的子包:from package import *

这是否与在 init 文件中写入导入子包名称(而不是 __all__)相同?

我读过一篇文章说如果包目录中的 init.py 文件包含一个名为 all 的列表,它被认为是一个模块列表,应该当遇到 import * 的语句时被导入。

【问题讨论】:

  • __all__ 旨在列出模块中的“导出名称”。它不会触发子包的导入
  • @Anthony - 一篇在线文章说 - 如果包目录中的 init.py 文件包含一个名为 all 的列表,则将其带到是遇到 import * 语句时应导入的模块列表。

标签: python python-3.x


【解决方案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 *。
猜你喜欢
  • 2015-10-12
  • 2013-05-31
  • 1970-01-01
  • 2015-04-11
  • 2012-08-27
  • 1970-01-01
  • 2022-01-06
  • 2013-09-07
  • 1970-01-01
相关资源
最近更新 更多