Python пусто возвращает аннотацию типа

В Python 3.x, распространено использовать аннотацию типа возврата функции, такой как:

def foo() -> str:
    return "bar"

Какова корректная аннотация для "пустого" типа?

Я рассматриваю 3 возможности:

  1. def foo() -> None:
    • не логический IMO, потому что None не тип,
  2. def foo() -> type(None):
    • с помощью лучшего синтаксиса я знаю для получения NoneType,
  3. def foo():
    • опустите явную информацию о типе возврата.

Опция 2. кажется самым логическим мне, но я уже видел некоторые экземпляры 1.

61
задан 22 April 2016 в 18:38

1 ответ

TLDR: идиоматический эквивалент void аннотация типа возврата -> None.

def foo() -> None:
    pass
<час>

Тип, подсказывающий в Python, строго не требует фактических типов. Например, аннотации могут использовать строки имен типов: Union[str, int], Union[str, 'int'], 'Union[str, int]' и различные варианты эквивалентны.

Точно так же аннотацию типа None рассматривают для значения , "имеет NoneType". Это может использоваться не только для типов возврата, хотя Вы будете чаще всего видеть его там:

bar : None

def foo(baz: None) -> None:
    return None

Это также относится к универсальным типам. Например, можно использовать None в [1 111], чтобы указать, что генератор не берет или возвращает значения.

<час>

Даже при том, что PEP 484 предлагает, чтобы None средства type(None), Вы не были должны использовать последнюю форму явно. Тип, подсказывающий, спецификация делает не , включают любую форму [1 114]. Это - технически выражение во время выполнения, и его поддержка полностью до средства проверки типа. mypy проект рассмотрение, чтобы удалить поддержку для [1 116] и удалить его от 484 также.

Или возможно мы должны обновить PEP 484, чтобы не предположить, что type(None) допустимо, поскольку тип, и None является единственным корректным написанием? Там должен один - и предпочтительно только один - очевидный способ сделать это и т.д.

---JukkaL, 18 мая 2018

, статический эквивалент "типа X" Type[X]. Это допустимо для [1 120] также:

def foo() -> Type[None]:
    pass

Однако это - в основном эквивалент [1 121] и подобный. Это устраняет один особый случай (использование значения вместо типа) с другим особым случаем (использование типа, полученного из значения). Идиоматический особый случай должен просто использовать None.

<час>

Исключение типа возврата делает не средний, что нет никакого возвращаемого значения. Согласно [1 127] PEP 484:

Для проверенной функции, аннотация по умолчанию для аргументов и для типа возврата Any.

Это означает, что значение считают с динамическим контролем типов и статически поддержки любая операция . Это - практически противоположное значение [1 124].

9
ответ дан 31 October 2019 в 16:14

Другие вопросы по тегам:

Похожие вопросы: