Por ejemplo:
def foo(bar: int = None): pass Cuando verifico un tipo/anotación de bar pycharm me dice que es Optional[int] .
bar: int = None se ve mucho más limpio que bar: Optional[int] = None , especialmente cuando tiene más de 10 parámetros.
Entonces, ¿puedo simplemente omitir Optional ? ¿Las herramientas como mypy u otros linters resaltarán este caso como un error?
Parece que a Python en sí no le gusta la idea:
In [1]: from typing import Optional In [2]: from inspect import signature In [3]: def foo(a: int = None): pass In [4]: def bar(a: Optional[int] = None): pass In [5]: signature(foo).parameters['a'].annotation Out[5]: int In [6]: signature(bar).parameters['a'].annotation Out[6]: typing.Union[int, NoneType]No. Anteriormente se permitía Omitir Optional , pero desde entonces se eliminó.
Una versión anterior de este PEP permitía a los verificadores de tipos asumir un tipo opcional cuando el valor predeterminado es Ninguno [...]
Este ya no es el comportamiento recomendado. Los verificadores de tipo deberían pasar a exigir que el tipo opcional se haga explícito.
Algunas herramientas aún pueden proporcionar el comportamiento anterior para el soporte heredado. Incluso si ese es el caso, no confíe en que sea compatible en el futuro.
En específico, mypy todavía admite Optional implícito de forma predeterminada, pero señala explícitamente que esto puede cambiar en el futuro:
Tipos opcionales y el tipo Ninguno (mypy v0.782)
[...] Puede usar la opción de línea de comando
--no-implicit-optionalpara dejar de tratar los argumentos con un valor predeterminado Ninguno como si tuvieran un tipo implícito Opcional[...]. Es posible que esto se convierta en el comportamiento predeterminado en el futuro.
La obsolescencia de este comportamiento se rastrea en mypy/#9091
Una versión anterior de la norma, tal como se define en PEP 484 , permitía esto.
Sin embargo, la versión más actualizada establece lo siguiente en la sección Unión :
Una versión anterior de este PEP permitía que los verificadores de tipos asumieran un tipo opcional cuando el valor predeterminado era Ninguno, como en este código:
def handle_employee(e: Employee = None): ...Esto se habría tratado como equivalente a:
def handle_employee(e: Optional[Employee] = None) -> None: ...Este ya no es el comportamiento recomendado. Los verificadores de tipo deberían pasar a exigir que el tipo opcional se haga explícito.
Me alegro de esto. A mis ojos, en realidad parece discordante.