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
None
no 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
void
tipo de retorno. Cualquier función (o rama en una función) sin unreturn
retorno 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
None
como tipo de retorno.fuente
NoReturn
tipo 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
void
anotación de tipo de retorno es-> None
.Esto coincide con lo que evalúa una función sin
return
o simplementereturn
conNone
.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,
None
se 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
None
inGenerator[int, None, None]
para indicar que un generador no toma ni devuelve valores.Aunque PEP 484 sugiere que eso
None
significatype(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. Elmypy
proyecto está considerando la posibilidad de eliminar el soporte paratype(None)
y sacarlo de 484 también.fuente