1 from itertools import chain
5 def __eq__(self, other):
9 for key in self.keys():
10 if getattr(self, key) != getattr(other, key):
17 def __neq__(self, other):
18 return not self.__eq__(other)
21 return self.__repr__()
25 self.__class__.__name__,
27 "%s=%r" % (k, v) for k, v in self.items()
32 for key in self.keys():
33 yield key, getattr(self, key)
38 chain(getattr(self, "__slots__", []), self.__dict__.keys())
44 (k, self._serialize(v))
45 for k, v in self.items()
48 def _serialize(self, value):
49 if hasattr(value, "serialize"):
50 return value.serialize()
55 def deserialize(cls, doc_or_instance):
56 if isinstance(doc_or_instance, cls):
57 return doc_or_instance
59 return cls(**doc_or_instance)
62 class Dict(dict, Type):
64 return {k: self._serialize(v) for k, v in self.items()}
67 def deserialize(d, value_deserializer=lambda v: v):
68 if isinstance(d, Dict):
71 return Dict((k, value_deserializer(v)) for k, v in d.items())
76 return [self._serialize(v) for v in self]
79 def deserialize(s, value_deserializer=lambda v: v):
81 if isinstance(s, Set):
84 return Set(value_deserializer(v) for v in s)
87 class List(list, Type):
89 return list(self._serialize(v) for v in self)
92 def deserialize(l, value_deserializer=lambda v: v):
94 if isinstance(l, List):
97 return List(value_deserializer(v) for v in l)