@@ -28,6 +28,7 @@ def __init__(
2828 manual : bool ,
2929 defaults : bool ,
3030 infer : bool ,
31+ key_attrs : Dict ,
3132 root : Optional [Mapper ] = None ,
3233 ) -> None :
3334 assert manual is not None
@@ -38,6 +39,7 @@ def __init__(
3839 self ._manual = manual
3940 self .defaults = defaults
4041 self ._infer = infer
42+ self .key_attrs = key_attrs
4143 self ._last_load = 0.0
4244 self ._last_data : Dict = {}
4345 self ._root = root
@@ -278,6 +280,7 @@ def create_mapper(obj, root=None) -> Mapper:
278280 meta = config .load (obj )
279281 attrs = meta .datafile_attrs
280282 pattern = meta .datafile_pattern
283+ key_attrs = meta .datafile_key_attrs
281284
282285 if attrs is None and dataclasses .is_dataclass (obj ):
283286 attrs = {}
@@ -287,12 +290,21 @@ def create_mapper(obj, root=None) -> Mapper:
287290 if pattern is None or self_name not in pattern :
288291 attrs [field .name ] = map_type (resolve (field .type , obj ), name = field .name ) # type: ignore
289292
293+ if key_attrs is None and dataclasses .is_dataclass (obj ):
294+ key_attrs = {}
295+ log .debug (f"Mapping key attributes for { obj .__class__ } object" )
296+ for field in dataclasses .fields (obj ):
297+ self_name = f"self.{ field .name } "
298+ if pattern is not None and self_name in pattern :
299+ key_attrs [field .name ] = map_type (resolve (field .type , obj ), name = field .name ) # type: ignore
300+
290301 return Mapper (
291302 obj ,
292303 attrs = attrs or {},
293304 pattern = pattern ,
294305 manual = meta .datafile_manual ,
295306 defaults = meta .datafile_defaults ,
296307 infer = meta .datafile_infer ,
308+ key_attrs = key_attrs or {},
297309 root = root ,
298310 )
0 commit comments