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.

Python dataclasses circular parsing with marshmallow Clases de datos en Python y procesamiento circular con marshmallow.

Estoy trabajando con una estructura de datos JSON y estoy tratando de representarla como una dataclass. La estructura de datos es (en parte) circular y quiero que las estructuras de datos anidadas se representen de manera ordenada como dataclasses también.

Estoy teniendo algunos problemas para que las dataclasses se analicen correctamente. Ve el ejemplo simplificado a continuación:

from typing import List, Optional, Union

class SchemaTypeName(Enum):
    LONG = "long"
    NULL = "null"
    RECORD = "record"
    STRING = "string"

@dataclass_json
@dataclass
class SchemaType():

type: Union[
    SchemaTypeName,
    'SchemaType',
    List[
        Union[
            SchemaTypeName,
            'SchemaType'
        ]
    ]
]

fields: Optional[List['SchemaType']] = None
name: Optional[str] = None

A continuación se muestra una impresión del objeto devuelto después de llamar a from_dict con algunos datos de muestra. Observa que el objeto anidado (indicado con la flecha) no se analiza correctamente como una dataclass.

SchemaType(
    type=[
        'null', 
------> {
            'fields': [
                {'name': 'id', 'type': 'string'}, 
                {'name': 'date', 'type': ['null', 'long']}, 
                {'name': 'name', 'type': ['null', 'string']}
            ],
            'type': 'record'
        }
    ]
)

¿Estoy declarando incorrectamente la sugerencia de tipo para el campo type?

Estoy usando Python 3.9 con dataclasses_json==0.5.2 y marshmallow==3.11.1.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede estar en la indicación de tipo Union para el campo type. En la implementación actual, type puede aceptar tanto un SchemaTypeName, un SchemaType anidado, o una lista de objetos SchemaTypeName o SchemaType anidados.

    Sin embargo, los datos de muestra proporcionados en la impresión muestran que uno de los objetos de la lista tiene una estructura de diccionario, que no coincide con ninguno de los tipos aceptados en la indicación de Union. Esto podría estar causando el problema al analizar el objeto anidado como una dataclass.

    Para solucionar este problema, es posible que desee considerar agregar una indicación de tipo separada para los diccionarios anidados en la indicación de Union para el campo type. Por ejemplo:

    from typing import Dict
    
    ...
    
        type: Union[
            SchemaTypeName,
            'SchemaType',
            List[
                Union[
                    SchemaTypeName,
                    'SchemaType',
                    Dict[str, Union[str, int, List[Union[str, int]]]] # nueva indicación de tipo para diccionarios anidados
                ]
            ]
        ]
    

    Esto permitirá que el analizador identifique correctamente los diccionarios anidados como un objeto de dataclass válido.

    Además, es posible que desee asegurarse de que las versiones de dataclass_json y marshmallow sean compatibles, ya que esto también podría causar problemas con el análisis. Puede verificar la matriz de compatibilidad de estas bibliotecas para asegurarse de que está utilizando versiones compatibles.

Comments are closed.