34 lines
1,014 B
Python
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
|