Ferramentas/AjustaFundos/actions/data/obj_to_dict.py

34 lines
1,014 B
Python

from types import SimpleNamespace
from collections.abc import Mapping
from decimal import Decimal
from datetime import datetime, date
class ObjToDict:
def __new__(cls, x):
# SimpleNamespace -> dict (recursivo)
if isinstance(x, SimpleNamespace):
return {k: cls(v) for k, v in vars(x).items()}
# dict / Mapping -> dict (recursivo)
if isinstance(x, Mapping):
return {k: cls(v) for k, v in x.items()}
# listas/tuplas/conjuntos -> preserva tipo
if isinstance(x, list):
return [cls(i) for i in x]
if isinstance(x, tuple):
return tuple(cls(i) for i in x)
if isinstance(x, set):
return {cls(i) for i in x}
# Decimal -> float
if isinstance(x, Decimal):
return float(x)
# datetime / date -> string ISO (compatível com JSON)
if isinstance(x, (datetime, date)):
return x.isoformat()
# Outros tipos -> mantém
return x