TLDR: Ідіоматичним еквівалентом void
анотації типу повернення є -> None
.
def foo() -> None:
...
Це відповідає тому, що функція без return
або просто оголена return
оцінює None
.
def void_func(): # unannotated void function
pass
print(void()) # None
Якщо пропустити тип повернення, це не означає, що значення повернення не існує. Відповідно до PEP 484 :
Для перевіреної функції анотацією за замовчуванням для аргументів і для типу повернення є Any
.
Це означає, що значення вважається динамічним набором і статично підтримує будь-яку операцію . Це практично протилежне значення 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 , а також.
Або, можливо, нам слід оновити PEP 484, щоб не пропонувати, що type(None)
є дійсним як тип, іNone
є єдино правильним написанням? Це повинен бути один - і бажано лише один - очевидний спосіб зробити це тощо.
--- JukkaL, 18 травня 2018 р
void
типом повернення. Будь-яка функція (або гілка у функції) без явногоreturn
повернення повернетьсяNone
. Я припускаю, що OP розуміє, що цей коментар здебільшого корисний майбутнім читачам ...