Почему печатный модуль экспортирует «подмодули»? - PullRequest
0 голосов
/ 03 ноября 2018

Модуль typing экспортирует два класса, io и re, как "псевдоподмодули", воспроизведенные ниже. Каково намерение сделать их похожими на модули, задав им __all__ и добавив их к sys.modules?

Я понимаю обоснование исключения их из __all__: чтобы from typing import * не маскировал io и re, если они импортированы.

Но зачем добавлять '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

1 Ответ

0 голосов
/ 04 ноября 2018

Первоначально предполагалось, что модуль типизации будет накапливать «типизированные версии» многих классов в стандартной библиотеке - например, такие типы, как тип Pattern в typing.re или тип BinaryIO в typing.io .

В этом случае имеет смысл попытаться поместить пространство имен этих «фантомных типов» в субмодульные вещи для организационных целей. Так, например, typing.re.Pattern будет каноническим домом для типа Pattern и будет реэкспортирован через typing.Pattern для удобства.

На практике это видение так и не было полностью реализовано: я подозреваю, что это отчасти связано с тем, что возможности вывода типов в контролерах типов PEP 484 были достаточно сложными, чтобы избежать необходимости явно указывать подсказки типов во многих случаях, и частично потому что в итоге оказалось более удобным включать эти типы непосредственно в typing или в заглушки, соответствующие соответствующему модулю стандартной библиотеки.

Итак, было принято (на самом деле совсем недавно) решение просто отказаться от этих двух модулей: см. https://github.com/python/typing/issues/589 и https://github.com/python/cpython/pull/10173. Короче говоря, документы были обновлены только на прошлой неделе, чтобы никогда упомяните typing.io и typing.re - новая рекомендация - импортировать соответствующие типы непосредственно из модуля typing.

Вероятно, в будущих версиях Python модули будут полностью удалены, хотя, скорее всего, они будут немного задерживаться по причинам обратной совместимости.

...