为什么输入模块会导出“子模块”?

布拉德·所罗门

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

我理解的理由背后来自排除他们__all__:让from typing 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
迈克尔0x2a

最初的目的是键入模块将在标准库中累积许多类的“类型化版本”,例如,诸如Patternin中typing.reBinaryIO类型in中类型typing.io

在那种情况下,为了组织目的,尝试将这些“幻像类型”命名为子模块式的东西是有意义的。因此,例如,typing.re.Pattern它将是该Pattern类型的规范家,并且typing.Pattern为了方便起见,将其重新导出

在实践中,这种愿景从未真正实现:我怀疑这部分是因为PEP 484类型检查器的类型推断功能足够复杂,可以使您避免在很多情况下必须明确提供类型提示,部分原因是因为它终止了只是将这些类型直接包含typing在与相关标准库模块相对应的存根包含在其中更加方便

因此,决定(实际上相当近期)决定不赞成使用这两个模块:请参阅https://github.com/python/typing/issues/589https://github.com/python/cpython/pull / 10173总之,这个文档上周刚刚进行了更新,从来不提typing.iotyping.re-新的建议是直接从导入相关类型的typing模块来代替。

可能在将来的Python版本中,这些模块将被完全删除,尽管由于向后兼容的原因它们可能会停留一些时间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当未定义默认导出时,“模块”中的导入模块会导入什么?为什么它与作为模块导入*不同?

为什么“ git submodule update”会跳过一个子模块?

什么是“脏”子模块?

为什么子模块的代码尝试直接或通过相对导入来导入同级子模块?

为什么Python 3 Statistics模块将collections模块作为子模块?

在(Vue,React)中使用子模块导出模块的最佳方法是什么

为什么在根模块(AppModule)中导入和重新导出CommonModule时需要将其导入其他自定义/子模块

为什么libGdx资产位于android子模块中

为什么我的Git子模块HEAD与master分离?

为什么rust无法在子模块中找到功能?

为什么在导入时不必指定子模块?

为什么我的PowerShell模块不能正确导出成员,为什么不能导出嵌套模块?

为什么注册模块会禁用重写?

为什么从模块导入功能会导入整个模块?

如何从子模块“导出”东西?

ES6模块:为什么“子”模块无法识别以前导出的模块?

IntelliJ IDEA和Gradle:为什么每个子模块有3个模块?

为什么向模块添加方法与添加子模块的处理方式不同?

为什么Python模块有时不导入其子模块?

导入模块和子模块。为什么要进口两次?

为什么React JS找不到我导出的模块?

为什么导出/导入默认ES模块属性比命名模块属性快?

如何使摘要模块重新导出ESM模块的所有子模块输出?

如何将父模块中的模块导出到子模块

为什么Javac会抱怨命名自动模块?

为什么导入模块会导致循环导入错误

为什么Python的re模块会转义分号字符

为什么对本地本机模块的调用会阻止UI?

为什么导入模块会破坏我的doctest(Python 2.7)