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.

Validación de tipo de objetos de datos anidados en Python 3.8+ con dacite.

Tengo una pregunta con respecto a los objetos de datos anidados.

Como se sugiere en otro post (https://stackoverflow.com/questions/51564841/creating-nested-dataclass-objects-in-python), podemos usar el paquete dacite para crear objetos de datos anidados. Esto funciona al manejar los datos que tenemos en una estructura de diccionario anidado.

from dataclasses import dataclass
from dacite import from_dict

@dataclass
class A:
    x: str
    y: int

@dataclass
class B:
    a: A

data = {
    'a': {
        'x': 'test',
        'y': 1,
    }
}

result = from_dict(data_class=B, data=data)

assert result == B(a=A(x='test', y=1))

Sin embargo, tengo una función de verificación de tipos de datos y una función de conversión de tipos de datos asociadas con la dataclass A en el ejemplo. En estas funciones, utilizo inspect.signature(A).parameters para obtener el tipo esperado de la dataclass y verificar si los datos están en el tipo esperado. ¿Podemos también llamar a la firma de la clase A desde la clase B o hay alguna solución alternativa para esto? Gracias.

El código actual de verificación de tipos es algo así:

expected_para = inspect.signature(A).parameters
def type_check(d_f: dict, expected_para):
    d_new = {}
    for k in expected_para.keys():
        # obtener el tipo esperado
        expected_type = expected_para[k].annotation
        # verificar si k está en d_f
        if k in d_f.keys():
            # verificar el tipo
            v = d_f[k]
            # conversión de tipo aquí
            d_new[k] = self.typeconversion(expected_type, v)
        else:
            d_new[k] = None
    return d_new
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para llamar a la firma de la clase A desde la clase B, puedes pasar la firma del parámetro esperado de la clase A como un parámetro para el constructor o un método de la clase B. De esta manera, la clase B puede acceder a la firma del parámetro de la clase A y usarla para comprobar el tipo y la conversión de datos anidados en la clase B.

    Alternativamente, podrías definir la firma del parámetro esperado de la clase A como una variable de clase y usarla en ambas clases A y B para comprobar el tipo y la conversión. De esta manera, la firma del parámetro esperado de la clase A es accesible para ambas clases sin tener que pasarla como un parámetro.

Comments are closed.