¿Cómo utilizo sugerencias de tipo para anotar una función que devuelve an Iterable
que siempre produce dos valores: ay bool
a str
? La sugerencia Tuple[bool, str]
es cercana, excepto que limita el tipo de valor de retorno a una tupla, no a un generador u otro tipo de iterable.
Tengo más curiosidad porque me gustaría anotar una función foo()
que se usa para devolver múltiples valores como este:
always_a_bool, always_a_str = foo()
Por lo general, funciona como foo()
hacer algo como return a, b
(que devuelve una tupla), pero me gustaría que la sugerencia de tipo sea lo suficientemente flexible como para reemplazar la tupla devuelta con un generador o una lista o algo más.
python
python-3.x
python-3.5
type-hinting
Richard Hansen
fuente
fuente
Respuestas:
Siempre estás devolviendo un objeto; el uso
return one, two
simplemente devuelve una tupla.Entonces sí,
-> Tuple[bool, str]
es completamente correcto.Solo el
Tuple
tipo le permite especificar un número fijo de elementos, cada uno con un tipo distinto. Realmente debería devolver una tupla, siempre, si su función produce un número fijo de valores de retorno, especialmente cuando esos valores son tipos específicos y distintos.Se espera que otros tipos de secuencia tengan una especificación de tipo para un número variable de elementos, por
typing.Sequence
lo que no es adecuado aquí. Consulte también ¿Cuál es la diferencia entre listas y tuplas?El sistema de sugerencias de tipos de Python se adhiere a esa filosofía, actualmente no existe una sintaxis para especificar un iterable de longitud fija y que contenga tipos específicos en posiciones específicas.
Si debe especificar que cualquier iterable servirá, lo mejor que puede hacer es:
momento en el que la persona que llama puede esperar valores booleanos y cadenas en cualquier orden y de longitud desconocida (entre 0 e infinito).
fuente
foo()
podría haceryield True; yield "blah"
ya, b = foo()
seguiría funcionando. Ofoo()
podría devolver una lista. Reformulé mi pregunta para dejar en claro que estoy interesado en insinuar un iterable arbitrario, no una tupla.typing
ymypy
otras 2 veces desde la publicación; Estoy bastante seguro de que no me perdí nada. Dicho esto, hay varios clientes habituales aquí en SO con mucha experiencia de sugerencias de tipo Python que no dudarán en corregirme si resultan estar equivocados, o publicarán una mejor respuesta.from typing import Tuple
para que la anotación Tuple funcionara.Iterable
yUnion
. Dado que estamos discutiendo su uso específico aquí, la importación está implícita.