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.

Crear un contenedor de anotaciones de tipo para múltiples variables.

Me gustaría crear un contenedor tipo DataFrame[T, …] que pueda contener varias variables definidas durante la anotación de tipos como el siguiente:

UserId = DataFrame[int] #singular

o

UserIdAndName = DataFrame[int, str] #múltiple

Y luego poder utilizar estos tipos en cualquier lugar donde se permitan tipos:

def get_name(x: UserId) -> UserIdAndName:.

Podría hacer funcionar el primer ejemplo utilizando Genéricos, pero para permitir la definición de múltiples parámetros sólo veo que funciona usando metaclasses + slices get_item, pero eso rompe en mypy.

¿Hay alguna solución pythonica que no rompa mypy?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una posible solución para crear un contenedor tipo DataFrame[T,..] que pueda contener múltiples variables definidas durante la anotación de tipo es usar typing.Tuple y typing.List. Aquí hay un ejemplo de implementación:

    from typing import TypeVar, Tuple, List
    
    T = TypeVar('T')
    
    class DataFrame:
        def __init__(self, *args: T) -> None:
            self.data = args
    
    UserId = DataFrame[int]
    UserIdAndName = DataFrame[int, str]
    
    def get_name(x: UserId) -> UserIdAndName:
        name = 'John' # obtener el nombre de la identificación del usuario
        return UserIdAndName(x.data[0], name)
    
    users = [UserId(1), UserId(2), UserId(3)]
    user_names = [get_name(user) for user in users]
    print(user_names) # [(1, 'John'), (2, 'John'), (3, 'John')]
    

    En esta implementación, definimos una clase genérica DataFrame que toma un número variable de parámetros de tipo usando la sintaxis asterisco (*args: T). Luego definimos dos alias de tipo para marcos de datos específicos: UserId, que contiene un solo entero, y UserIdAndName, que contiene un entero y una cadena.

    Luego podemos definir una función get_name que toma un UserId y devuelve un UserIdAndName. Simulamos la obtención del nombre de la identificación del usuario devolviendo un nombre codificado en duro ‘John’. Finalmente, demostramos el uso de estos tipos personalizados creando una lista de objetos UserId y luego aplicando get_name a cada elemento, lo que resulta en una lista de objetos UserIdAndName.

    Esta implementación debe ser compatible con las anotaciones de tipo de mypy y sigue la filosofía de tipado pato de Python, lo que permite flexibilidad en la definición de tipos de DataFrame.

Comments are closed.