【问题标题】:What's the python __all__ module level variable for? [duplicate]python __all__ 模块级变量有什么用? [复制]
【发布时间】:2011-01-12 08:31:21
【问题描述】:

我在 python/Lib 源代码中看到了很多,但我不知道它是干什么用的。

我认为它用于限制模块的可访问成员。所以只有__all__ 的元素会在dir(module) 出现。

我做了一个小例子,发现它没有按预期工作。

那么... python __all__ 模块级变量是干什么用的?

【问题讨论】:

标签: python namespaces


【解决方案1】:

http://docs.python.org/tutorial/modules.html#importing-from-a-package

现在当用户写入时会发生什么 from sound.effects import *?理想情况下, 人们希望这会以某种方式发生 输出到文件系统,找到哪个 包中存在子模块, 并将它们全部导入。这可能需要 很长一段时间和导入子模块 可能有不想要的副作用 应该只发生在子模块 是显式导入的。

唯一的解决方案是包装 作者提供明确的索引 包裹。导入语句使用 以下约定:如果 包的__init__.py 代码定义了一个 名为__all__ 的列表,它被认为是 应该的模块名称列表 当from package import *时被导入 遇到。这取决于 包作者保留此列表 最新版本的新版本 包发布。包作者 也可以决定不支持它,如果 他们没有看到导入 * 从他们的包裹中。

【讨论】:

    【解决方案2】:

    它有两个目的:

    1. 任何阅读源代码的人都会知道公开的公共 API 是什么。它并没有阻止他们在私有声明中四处寻找,但确实提供了一个很好的警告。

    2. 使用from mod import * 时,只会导入__all__ 中列出的名称。在我看来,这并不重要,因为导入所有内容真的是个坏主意。

    【讨论】:

    • 不只是任何人,还有任何事情。一些 api 文档工具尊重__all__。 pydoc 可以,我很确定 epydoc 之类的也可以。
    • 当我们执行 'import *' 时,'.py' 中的公共变量在另一个文件中可用,即使它们未包含在 all.can any有人请澄清这一点..?
    • Sphinx 也尊重__all__
    【解决方案3】:

    它控制你在你的名字空间中被拉入的内容

    from blah import *
    

    Importing * from a Package

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2011-04-04
      相关资源
      最近更新 更多