В python 3.x обычно используется аннотация типа возвращаемого значения функции, например:
def foo() -> str:
return "bar"
Какая аннотация подходит для типа "void"?
Рассматриваю 3 варианта:
def foo() -> None:
- не логично ИМО, потому что
None
это не тип,
- не логично ИМО, потому что
def foo() -> type(None):
- используя лучший синтаксис, который я знаю для получения
NoneType
,
- используя лучший синтаксис, который я знаю для получения
def foo():
- опускать явную информацию о типе возврата.
Вариант 2 кажется мне наиболее логичным, но я уже видел несколько примеров 1.
python
annotations
void
type-hinting
Tregoreg
источник
источник
void
возвращаемым типом. Любая функция (или ветвь в функции) без явного значенияreturn
вернетсяNone
. Я предполагаю, что OP понимает это, этот комментарий в основном для будущих читателей ...Ответы:
Это прямо из документации PEP 484 - Type Hints :
И, как вы можете видеть, в большинстве примеров используется
None
тип возвращаемого значения.источник
NoReturn
типа используется «... для аннотирования функций, которые никогда не возвращаются нормально. Например, функция, которая безусловно вызывает исключение ...»TL; DR: идиоматический эквивалент
void
аннотации возвращаемого типа --> None
.def foo() -> None: ...
Это соответствует тому, что функция без
return
или простоreturn
оцениваетNone
.def void_func(): # unannotated void function pass print(void()) # None
Отсутствие возвращаемого типа не означает, что возвращаемого значения нет. Согласно PEP 484 :
Это означает, что значение считается динамически типизированным и статически поддерживает любую операцию . Это практически противоположное значение
void
.Подсказка типов в Python не требует строго фактических типов. Например, аннотации могут использовать строки имен типа:
Union[str, int]
,Union[str, 'int']
,'Union[str, int]'
а также различные варианты эквивалентны.Точно так же аннотация типа
None
считается означающей «имеетNoneType
». Это можно использовать не только для возвращаемых типов, хотя чаще всего вы увидите это там:bar : None def foo(baz: None) -> None: return None
Это также относится к универсальным типам. Например, вы можете использовать
None
in,Generator[int, None, None]
чтобы указать, что генератор не принимает и не возвращает значения.Несмотря на то, что PEP 484 предполагает, что это
None
означаетtype(None)
, вы не должны использовать последнюю форму явно. Спецификация подсказки типов не включает никаких формtype(...)
. Технически это выражение времени выполнения, и его поддержка полностью зависит от средства проверки типов.mypy
Проект рассматривает возможность удалить поддержку дляtype(None)
и удалить его из 484 , а также.источник