Подтвердить что ты не робот

Аннотации типа Python void return

В python 3.x обычно используется аннотация функции типа возвращаемого значения, например:

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

Какова правильная аннотация для типа "void"?

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

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

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

4b9b3361

Ответ 1

Это прямо из документация PEP 484 - Тип подсказки:

При использовании в подсказке типа выражение None считается эквивалентным type(None).

И, как вы видите, большинство примеров используют None как возвращаемый тип.

Ответ 2

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

def foo() -> None:
    pass

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

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

bar : None

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

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


Даже если PEP 484 предполагает, что " None означает " type(None), вам не следует явно использовать последнюю форму. Спецификация подсказок типа не включает в себя какую-либо форму type(...). Технически это выражение времени выполнения, и его поддержка полностью зависит от проверки типов. Проект mypy рассматривает возможность удаления поддержки type(None) и удаления ее из 484.

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

--- Юккаль, 18 мая 2018 г.

Статическим эквивалентом "типа X" является Type[X]. Это верно и для None:

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

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


Пропуск возвращаемого типа не означает, что возвращаемого значения нет. Согласно ПКП 484:

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

Это означает, что значение считается динамически типизированным и статически поддерживает любую операцию. Это практически противоположное значение void.