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.

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

Tags:  , ,

Answer

  1. Avatar for 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ón typing.Repeat. La función typing.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ón preprocess:

    import pandas as pd
    from typing import Tuple, TypeVar, Repeat
    
    N = 4
    T = TypeVar('T')
    
    def preprocess(df: pd.DataFrame) -> Tuple[Repeat[T, N]]:
        pass
    

    Ten en cuenta que estamos usando un TypeVar para representar el tipo de cada elemento de la tupla, y luego usando Repeat[T, N] para especificar que queremos N ocurrencias de T 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.

Comments are closed.