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?
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:
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 aplicandoget_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.