¿Anotación de función de Python con tupla y N pd DataFrames?
Tengo una función que devuelve N=4
DataFrames de pandas. Puedo especificar claramente todos los tipos para la función de la siguiente manera:
import pandas as pd
from typing import Tuple
def preprocess(df: pd.DataFrame) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]:
pass
Pero esto es un poco largo y preferiría una anotación más pythonica en caso de tener que devolver una tupla con generalmente N
elementos. Dado que los tipos de retorno se especifican como una tupla y para la inicialización de tuplas hay una característica conveniente en Python que reemplaza inicializaciones largas como (1,1,1,1,1,1)
escribiendo simplemente (1,)*6
, pensé que un enfoque similar podría funcionar aquí también:
import pandas as pd
from typing import Tuple
N = 4
def preprocess(df: pd.DataFrame) -> Tuple[pd.DataFrame] * N:
pass
Pero esto genera un error:
unsupported operand type(s) for *: '_GenericAlias' and 'int'
¿Cómo puedo anotar mi función correctamente?
Editar: Mi objetivo no es establecer las anotaciones dinámicamente. Solo me pregunto si existe una forma pythonica de declarar tuplas de cualquier longitud como valor de retorno, en lugar de tener que escribir anotaciones largas como Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]
. Imagina si una función tuviera que devolver N=20
objetos en una tupla, por ejemplo.
davy.ai
Hay una manera de especificar los tipos de retorno para tuplas de longitud variable usando la anotación de tipo
Tuple
y la funcióntyping.Repeat
. La funcióntyping.Repeat
se puede usar para especificar múltiples ocurrencias de un solo tipo, de manera similar a la sintaxis*
para las tuplas. Aquí tienes cómo puedes usarla para anotar tu funciónpreprocess
:Ten en cuenta que estamos usando un
TypeVar
para representar el tipo de cada elemento de la tupla, y luego usandoRepeat[T, N]
para especificar que queremosN
ocurrencias deT
en la tupla.Este enfoque es más conciso que especificar cada elemento de la tupla individualmente, y te permite cambiar fácilmente el tamaño de la tupla actualizando la constante
N
.