В Python 3.x, распространено использовать аннотацию типа возврата функции, такой как:
def foo() -> str:
return "bar"
Какова корректная аннотация для "пустого" типа?
Я рассматриваю 3 возможности:
def foo() -> None:
None
не тип,def foo() -> type(None):
NoneType
,def foo():
Опция 2. кажется самым логическим мне, но я уже видел некоторые экземпляры 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
является единственным корректным написанием? Там должен один - и предпочтительно только один - очевидный способ сделать это и т.д.
, статический эквивалент "типа X" Type[X]
. Это допустимо для [1 120] также:
def foo() -> Type[None]:
pass
Однако это - в основном эквивалент [1 121] и подобный. Это устраняет один особый случай (использование значения вместо типа) с другим особым случаем (использование типа, полученного из значения). Идиоматический особый случай должен просто использовать None
.
Исключение типа возврата делает не средний, что нет никакого возвращаемого значения. Согласно [1 127] PEP 484:
Для проверенной функции, аннотация по умолчанию для аргументов и для типа возврата
Any
.
Это означает, что значение считают с динамическим контролем типов и статически поддержки любая операция . Это - практически противоположное значение [1 124].