@@ -19,10 +19,53 @@ def keygetter(
19
19
) -> Union [None , Any , str , list [str ], Mapping [str , str ]]:
20
20
"""Fetch values in objects and keys, deeply.
21
21
22
- >>> keygetter({ "foods": { "breakfast": "cereal" } }, "foods__breakfast")
23
- 'cereal'
24
- >>> keygetter({ "foods ": { "breakfast": "cereal" } }, "foods ")
22
+ **With dictionaries**:
23
+
24
+ >>> keygetter({ "menu ": { "breakfast": "cereal" } }, "menu ")
25
25
{'breakfast': 'cereal'}
26
+
27
+ >>> keygetter({ "menu": { "breakfast": "cereal" } }, "menu__breakfast")
28
+ 'cereal'
29
+
30
+ **With objects**:
31
+
32
+ >>> from typing import Optional
33
+ >>> from dataclasses import dataclass, field
34
+
35
+ >>> @dataclass()
36
+ ... class Menu:
37
+ ... fruit: list[str] = field(default_factory=list)
38
+ ... breakfast: Optional[str] = None
39
+
40
+
41
+ >>> @dataclass()
42
+ ... class Restaurant:
43
+ ... place: str
44
+ ... city: str
45
+ ... state: str
46
+ ... menu: Menu = field(default_factory=Menu)
47
+
48
+
49
+ >>> restaurant = Restaurant(
50
+ ... place="Largo",
51
+ ... city="Tampa",
52
+ ... state="Florida",
53
+ ... menu=Menu(
54
+ ... fruit=["banana", "orange"], breakfast="cereal"
55
+ ... )
56
+ ... )
57
+
58
+ >>> restaurant
59
+ Restaurant(place='Largo',
60
+ city='Tampa',
61
+ state='Florida',
62
+ menu=Menu(fruit=['banana', 'orange'], breakfast='cereal'))
63
+
64
+ >>> keygetter(restaurant, "menu")
65
+ Menu(fruit=['banana', 'orange'], breakfast='cereal')
66
+
67
+ >>> keygetter(restaurant, "menu__breakfast")
68
+ 'cereal'
26
69
"""
27
70
try :
28
71
sub_fields = path .split ("__" )
0 commit comments