W Pythonie 3.x często używa się adnotacji typu zwracanego funkcji, takich jak:
def foo() -> str:
return "bar"
Jaka jest prawidłowa adnotacja dla typu „void”?
Rozważam 3 opcje:
def foo() -> None:
- nie logiczne IMO, ponieważ
None
nie jest typem,
- nie logiczne IMO, ponieważ
def foo() -> type(None):
- używając najlepszej znanej mi składni do uzyskania
NoneType
,
- używając najlepszej znanej mi składni do uzyskania
def foo():
- pomiń jawne informacje o zwracanym typie.
Opcja 2. wydaje mi się najbardziej logiczna, ale widziałem już kilka przykładów 1.
python
annotations
void
type-hinting
Tregoreg
źródło
źródło
void
typem zwracanym. Dowolna funkcja (lub gałąź funkcji) bez jawnościreturn
zwróciNone
. Zakładam, że OP rozumie, że ten komentarz jest głównie dla przyszłych czytelników ...Odpowiedzi:
To pochodzi prosto z dokumentacji PEP 484 - Wskazówki dotyczące typów :
Jak widać, większość przykładów używa
None
jako typu zwracanego.źródło
NoReturn
typ jest używany „... do funkcji adnotacje, że nigdy nie wróci normalnie Na przykład, funkcja, która bezwarunkowo podnosi wyjątek ...”TLDR: idiomatyczny odpowiednik
void
adnotacji typu zwracanego to-> None
.def foo() -> None: ...
Ten odpowiada, że funkcja bez
return
lub tylko gołereturn
ma wartośćNone
.def void_func(): # unannotated void function pass print(void()) # None
Pominięcie zwracanego typu nie oznacza, że nie ma zwracanej wartości. Zgodnie z PEP 484 :
Oznacza to, że wartość jest uważana za wpisaną dynamicznie i statycznie obsługuje każdą operację . To jest praktycznie przeciwne znaczenie
void
.Podpowiedzi do typów w Pythonie nie wymagają ściśle określonych typów. Na przykład, adnotacje mogą używać ciągów nazw typu:
Union[str, int]
,Union[str, 'int']
,'Union[str, int]'
i różne warianty są równoważne.Podobnie
None
uważa się , że adnotacja typu oznacza „jest zNoneType
”. Można to wykorzystać nie tylko w przypadku typów zwracanych, chociaż zobaczysz to najczęściej:bar : None def foo(baz: None) -> None: return None
Dotyczy to również typów ogólnych. Na przykład można użyć
None
in,Generator[int, None, None]
aby wskazać, że generator nie przyjmuje ani nie zwraca wartości.Mimo że PEP 484 sugeruje, że
None
to oznaczatype(None)
, nie należy jawnie używać tej drugiej formy. Specyfikacja podpowiedzi typu nie obejmuje żadnej formytype(...)
. Jest to technicznie wyrażenie środowiska uruchomieniowego, a jego obsługa zależy wyłącznie od sprawdzania typów.mypy
Projekt rozważa usunięcie wsparcia dlatype(None)
i usunąć go z 484, jak również.źródło