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]?


Ответы (0 шт):