9 from . import dispatcher
12 class WalkerMeta(dispatcher
.DispatcherMeta
):
16 class PartId(enum
.Enum
):
18 Attribute
= enum
.auto()
21 def __call__(self
, part
):
23 PartId
.Index
: "[{part}]",
24 PartId
.Attribute
: ".{part}",
25 PartId
.Hash
: "{{{part}}}",
26 }[self
].format(part
=part
)
29 class Walker(dispatcher
.Dispatcher
, metaclass
=WalkerMeta
):
30 @dispatcher.Hook(tuple, list)
31 def dispatch_ordered_sequence(self
, instance
, path
=()):
32 for (index
, item
) in enumerate(instance
):
33 part
= (PartId
.Index
, index
)
34 parts
= (path
+ (part
,))
36 yield from self(item
, path
=parts
)
38 @dispatcher.Hook(set, frozenset)
39 def dispatch_unordered_sequence(self
, instance
, path
=[]):
41 part
= (PartId
.Hash
, item
)
42 parts
= (path
+ (part
,))
44 yield from self(item
, path
=parts
)
46 @dispatcher.Hook(dataclasses
.is_dataclass
)
47 def dispatch_dataclass(self
, instance
, path
=[]):
48 for field
in dataclasses
.fields(instance
):
50 value
= getattr(instance
, key
)
51 part
= (PartId
.Attribute
, key
)
52 parts
= (path
+ (part
,))
54 yield from self(value
, path
=parts
)
56 @dispatcher.Hook(dict)
57 def dispatch_mapping(self
, instance
, path
=[]):
58 for (key
, value
) in instance
.items():
59 part
= (PartId
.Index
, key
)
60 parts
= (path
+ (part
,))
62 yield from self(value
, path
=parts
)
64 @dispatcher.Hook(object)
65 def dispatch_object(self
, instance
, path
=()):