gpt4 book ai didi

python - 为什么输入模块会导出 "submodules"?

转载 作者:行者123 更新时间:2023-12-01 01:28:32 26 4
gpt4 key购买 nike

typing 模块将两个类 iore 导出为“伪子模块”,如下所示。通过赋予它们 __all__ 并将它们添加到 sys.modules 中,使它们看起来像模块的目的是什么?

我理解将它们排除在 __all__ 之外的理由:这样 fromtypeing import * 就不会屏蔽 iore 如果这些是导入的。

但是为什么要将 'typing.re''typing.io' 添加到 sys.modules 中?

<小时/>

来自typing.py的片段:

import re as stdlib_re

# The pseudo-submodules 're' and 'io' are part of the public
# namespace, but excluded from __all__ because they might stomp on
# legitimate imports of those modules.

# ...

class io:
"""Wrapper namespace for IO generic classes."""

__all__ = ['IO', 'TextIO', 'BinaryIO']
IO = IO
TextIO = TextIO
BinaryIO = BinaryIO


io.__name__ = __name__ + '.io'
sys.modules[io.__name__] = io

Pattern = _alias(stdlib_re.Pattern, AnyStr)
Match = _alias(stdlib_re.Match, AnyStr)

class re:
"""Wrapper namespace for re type aliases."""

__all__ = ['Pattern', 'Match']
Pattern = Pattern
Match = Match


re.__name__ = __name__ + '.re'
sys.modules[re.__name__] = re

最佳答案

最初的意图是,类型模块会在标准库中积累许多类的“类型化版本”——例如,像Pattern这样的类型。输入 typing.reBinaryIO输入 typing.io .

在这种情况下,出于组织目的,尝试将这些“幻像类型”命名为子模块式的事物是有意义的。例如,typing.re.Pattern将是 Pattern 的规范主页输入,然后通过 typing.Pattern 重新导出为了方便起见。

实际上,这一愿景从未完全实现:我怀疑这部分是因为 PEP 484 类型检查器的类型推断功能足够复杂,可以让您避免在很多情况下显式提供类型提示,部分是因为因为直接将这些类型包含在 typing 中会更方便或者在相关标准库模块对应的 stub 中。

因此,我们决定(实际上是最近)弃用这两个模块:请参阅 https://github.com/python/typing/issues/589https://github.com/python/cpython/pull/10173 。简而言之,文档上周刚刚更新,从未提及 typing.iotyping.re -- 新的建议是直接从 typing 导入相关类型模块代替。

可能在 Python 的 future 版本中,这些模块将被完全删除,尽管出于向后兼容性的原因它们可能会保留一些。

关于python - 为什么输入模块会导出 "submodules"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53127702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com