with tutorial framework español djangoproject desde con cero applications python python-3.x type-hinting

python - framework - tutorial django



Agregar valor de parámetro predeterminado con sugerencia de tipo en Python (3)

Si tengo una función como esta:

def foo(name, opts={}): pass

Y quiero agregar sugerencias de tipo a los parámetros, ¿cómo lo hago? La forma en que supuse me da un error de sintaxis:

def foo(name: str, opts={}: dict) -> str: pass

Lo siguiente no arroja un error de sintaxis, pero no parece la forma intuitiva de manejar este caso:

def foo(name: str, opts: dict={}) -> str: pass

No puedo encontrar nada en la documentación de typing o en una búsqueda en Google.

Editar: no sabía cómo funcionaban los argumentos predeterminados en Python, pero por el bien de esta pregunta, mantendré los ejemplos anteriores. En general, es mucho mejor hacer lo siguiente:

def foo(name: str, opts: dict=None) -> str: if not opts: opts={} pass


Hace poco vi esta frase:

def foo(name: str, opts: dict=None) -> str: opts = {} if not opts else opts pass


Si está usando la escritura (introducida en Python 3.5) puede usar la typing.Optional . Optional[X] , donde Optional[X] es equivalente a Union[X, None] . Se utiliza para indicar que el valor explícito de None está permitido. De typing.Optional . typing.Optional :

def foo(arg: Optional[int] = None) -> None: ...


Tu segunda forma es correcta.

def foo(opts: dict = {}): pass print(foo.__annotations__)

esto produce

{''opts'': <class ''dict''>}

Es cierto que no está en la lista en PEP 484 , pero las sugerencias de tipo son una aplicación de anotaciones de funciones, que están documentadas en PEP 3107. La sección de sintaxis deja en claro que los argumentos de palabras clave funcionan con las anotaciones de funciones de esta manera.

Recomiendo encarecidamente no utilizar argumentos de palabras clave mutables. Más información here .