Python Type-Hinting for nested dicts. Typing
class NestedDict(TypedDict):
key: Hashable
value: Mapping[Hashable, Mapping]
def get_all_values(nested_dicts: Mapping[Hashable, NestedDict], key: Hashable) -> set[Hashable]:
"""
Recursively finds all key values in nested dictionaries. Create a set of these values.
:param nested_dicts: Mapping[Hashable, NestedDict]
:param key:Hashable
:return:set[Hashable]
"""
unique_values = set()
def inner(obj: dict | Any) -> None:
"""Recursive value search"""
nonlocal unique_values
if type(obj) == dict:
if obj.get(key) is not None:
unique_values.add(obj[key])
else:
for k, value in obj.items():
inner(value)
inner(nested_dicts)
return unique_values
Помогите подобрать подсказку типов для вложенных словарей которые будут поступать на вход функции get_all_values. Функция просто собирает все значения по ключу на всех уровнях вложенности и отдает только уникальные. Уровень вложенности всегда будет разный
print(get_all_values({'s': {'d': 23}}, 'd'))
my_dict = {'DJ': {'hobby': 'videogames', 'drink': 'cacao'}, 'Bob': {'hobby':
'math'},
'Clar': {"hobby": "python, TMG"}}
result = get_all_values(my_dict, 'hobby')
print(result)
Вариант nested_dicts: Mapping[Hashable, dict] хорош, иде не ругается). Но хотелось бы описать как можно более конкретно. Pycharm ориентируясь по тестам говорит, братан, только так dict[str, dict[str, dict[str, int | list[int]] | dict[str, int | list[int]]]].
Так вот вопрос к тем кто с опытом, как пишут в таких ситуациях? Приемлемо писать nested_dicts: Mapping[Hashable, Mapping]?