from __future__ import annotations from dataclasses import asdict, is_dataclass from datetime import date, datetime from typing import Any def to_plain(value: Any) -> Any: if is_dataclass(value): return to_plain(asdict(value)) if isinstance(value, datetime): return value.isoformat() if isinstance(value, date): return value.isoformat() if isinstance(value, dict): return {key: to_plain(item) for key, item in value.items()} if isinstance(value, (list, tuple, set)): return [to_plain(item) for item in value] return value