es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for 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:

    from typing import TypeVar
    
    T = TypeVar('T')
    
    def first(the_list: list[T]) -> T:
        return the_list[0]
    

    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])) y print(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 como Union[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:

    from typing import List, TypeVar
    
    T = TypeVar('T')
    
    def first(the_list: List[T]) -> T:
        return the_list[0]
    

    Al importar el tipo List de typing y utilizarlo en su anotación de tipo, declara explícitamente que the_list solo debe contener elementos del mismo tipo. Ahora, cuando ejecuta su tercer caso de prueba print(first(["hello", 5])), mypy debería producir correctamente un error:

    error: Argument 1 to "first" has incompatible type "List[Union[str, int]]"; expected "List[str]"
    

Comments are closed.