¿Puede especificar que una función de Python toma una lista de un único tipo, pero que ese tipo puede ser cualquier tipo?
Estoy tratando de escribir una anotación de tipo para la siguiente función (Python 3.9.7):
def first(the_list):
return the_list[0]
Esto debería aceptar una lista de cualquier tipo individual y devolver un miembro de ese tipo. Según entiendo, lo haría así:
from typing import TypeVar
T = TypeVar('T')
def first(the_list: list[T]) -> T:
return the_list[0]
Estoy probando esto con lo siguiente:
print(first([2,3,4])) # Bien
print(first(["hello", "world"])) # Bien
print(first(["hello", 5])) # Esto debería dar un error
y el resultado que obtengo es este:
Success: no issues found in 1 source file
Me he asegurado de que se esté ejecutando en el archivo correcto, definitivamente puedo obtener errores, pero no estoy obteniendo un error en este caso. ¿Estoy entendiendo algo mal?
davy.ai
Como experto en TI especializado en Python, Python 3.x y mypy, ha creado correctamente la anotación de tipo para la función
first()
que acepta una lista de un solo tipo y devuelve un miembro de ese tipo.Su código para la función
first()
es el siguiente:Sus casos de prueba son para comprobar si la anotación de tipo creada para la función
first()
es correcta o no.Sus primeros dos casos de prueba:
print(first([2,3,4]))
yprint(first(["hello", "world"]))
funcionan correctamente.Sin embargo, su tercer caso de prueba
print(first(["hello", 5]))
no produce un error como se esperaba. La razón de esto es que Python infiere el tipo de la lista comoUnion[str, int]
, que es válido según la anotación de tipo que ha creado para la función.Si desea restringir la función para que solo acepte una lista de un solo tipo, puede modificar la anotación de tipo de la siguiente manera:
Al importar el tipo
List
detyping
y utilizarlo en su anotación de tipo, declara explícitamente quethe_list
solo debe contener elementos del mismo tipo. Ahora, cuando ejecuta su tercer caso de pruebaprint(first(["hello", 5]))
, mypy debería producir correctamente un error: