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
.
davy.ai
Parece que el problema puede estar en la indicación de tipo
Union
para el campotype
. En la implementación actual,type
puede aceptar tanto unSchemaTypeName
, unSchemaType
anidado, o una lista de objetosSchemaTypeName
oSchemaType
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 campotype
. Por ejemplo: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
ymarshmallow
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.