Why doesn't dataclasses.asdict work with dictionary values (not keys)?
from dataclasses import asdict, dataclass, field
@dataclass(order=True, frozen=True, eq=True)
class Path:
p: tuple[str, ...] = field(default=())
@dataclass
class C:
p: dict[Path, int] = field(default_factory=dict)
path = Path(('x', 'y'))
print(hash(path), asdict(path))
c = C({path: 1})
print(asdict(c)) # TypeError: unhashable type: 'dict'
dataclasses.asdict
attempts to be a "deep" operation. It will recursively explore dataclass instances, tuples, lists, and dicts, and attempt to convert all dataclass instances it finds into dicts.
It even does this when those dataclass instances appear as dict keys, even though trying to use the resulting dict as a dict key will always throw a TypeError.
For your use case, and a lot of others, it makes more sense to just use c.__dict__
instead of dataclasses.asdict(c)
.