Как пройтись полностью по всему словарю?

У нас есть такой вот словарь с множеством подсловарей:

some_dict = {
  "data1": {
    "data2": time.time,
    "data3": {
      "data4": time.time,
      "data5": {
        "data6": time.time
      }
    }
  },
  "data7": time.time
}

Каким образом можно пройтись по всему словарю, и проверить есть ли у значения вызываемая функция и в случае есть она присутствует вызвать и заменить это значение.

Моя попытка выглядит вот так: но я каждый раз в ручную проверяю не находится ли текущее значение ещё одним диктом и так до бесконечности выходит можно сказать.

Попытка:

for k, v in some_dict.items():
    if type(v) == dict:
        for k_s, v_s in v.items():
            if hasattr(v_s, '__call__'):
                some_dict[k][k_s] = v_s()
        continue

    if hasattr(v, '__call__'):
        some_dict[k] = v()

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

Автор решения: Edward Grachev

Все решается при помощи рекурсии

import time

some_dict = {
  "data1": {
    "data2": time.sleep,
    "data3": {
      "data4": time.sleep,
      "data5": {
        "data6": time.sleep
      }
    }
  },
  "data7": time.sleep,
  "data8": 'Hello'
}


def search(some_dict: dict):
    for key, value in some_dict.items():
        # Проверяем на словарь
        if isinstance(value, dict):
            # Запускаем рекурсию
            search(value)
        # Проверяем на функцию
        elif callable(value):
            # Запускаем функцию
            value(1)
            # Меняем значение
            some_dict[key] = 'Выполнил'
    return some_dict


print(search(some_dict))
→ Ссылка