En Python 3.x, es común usar la anotación de tipo de retorno de una función, como:
def foo() -> str:
return "bar"
¿Cuál es la anotación correcta para el tipo "vacío"?
Estoy considerando 3 opciones:
def foo() -> None:- no es lógico en mi opinión, porque
Noneno es un tipo,
- no es lógico en mi opinión, porque
def foo() -> type(None):- utilizando la mejor sintaxis que conozco para obtener
NoneType,
- utilizando la mejor sintaxis que conozco para obtener
def foo():- omitir información explícita del tipo de retorno.
La opción 2 me parece la más lógica, pero ya he visto algunos casos de 1.
python
annotations
void
type-hinting
Tregoreg
fuente
fuente

voidtipo de retorno. Cualquier función (o rama en una función) sin unreturnretorno explícitoNone. Supongo que el OP entiende que, este comentario es principalmente para el beneficio de los futuros lectores ...Respuestas:
Esto es directamente de la documentación de PEP 484 - Type Hints :
Y, como puede ver, la mayoría de los ejemplos se utilizan
Nonecomo tipo de retorno.fuente
NoReturntipo Type Hints se usa "... para anotar funciones que nunca regresan normalmente. Por ejemplo, una función que genera incondicionalmente una excepción ..."TLDR: el equivalente idiomático de una
voidanotación de tipo de retorno es-> None.Esto coincide con lo que evalúa una función sin
returno simplementereturnconNone.Omitir el tipo de devolución no significa que no haya un valor de devolución. Según PEP 484 :
Esto significa que el valor se considera de tipo dinámico y admite estáticamente cualquier operación . Ese es prácticamente el significado opuesto de
void.Las sugerencias de tipo en Python no requieren estrictamente tipos reales. Por ejemplo, las anotaciones pueden usar cadenas de nombres de tipo:
Union[str, int],Union[str, 'int'],'Union[str, int]'y varias variantes son equivalentes.De manera similar,
Nonese considera que la anotación de tipo significa "es deNoneType". Esto se puede usar no solo para tipos de devolución, aunque lo verá con más frecuencia allí:Esto también se aplica a los tipos genéricos. Por ejemplo, puede usar
NoneinGenerator[int, None, None]para indicar que un generador no toma ni devuelve valores.Aunque PEP 484 sugiere que eso
Nonesignificatype(None), no debe utilizar la última forma explícitamente. La especificación de sugerencia de tipo no incluye ninguna forma detype(...). Esta es técnicamente una expresión en tiempo de ejecución, y su soporte depende totalmente del verificador de tipos. Elmypyproyecto está considerando la posibilidad de eliminar el soporte paratype(None)y sacarlo de 484 también.fuente