Я никогда не использовал рекурсию, и я никогда не думал, что буду. До сих пор петли было достаточно.
Соревнование
- Учитывая Dict/список (объект), давайте назовем это
щиток приборов
- Поиск диктопов в
Приборная панель
который обладает данным ключом,«EXPR»
в моем случае - Каждый раз, когда вы найдете Dict с этим ключом, добавьте значение за этой клавишей в список и продолжайте поиск через
щиток приборов
-
Приборная панель
Содержит неизвестное количество диктовых и списков, которые вложены, и вы на самом деле не знаете структуру этогощиток приборов
, это совершенно неизвестно до времени выполнения
Данные, работающие над – Grafana Node-Exporter Dashboard – https://grafana.com/api/dashboards/1860/Revisions/19/download (JSON File)
Решение
- Я использовал
JSON
Чтобы импортировать файл и сохранить данные файла в переменной под названиемщиток приборов
- Я обнаружил, что мне нужно написать тонны петель, которые не имели смысла, поэтому я думал, что рекурсия может быть решением для этого .. И это было!
- Я позвонил в функцию
get_expressions.
Но вы можете назвать это чем угодно ты хочешь
Вот код
import json with open("node-exporter-full_rev19.json", "r") as file: dashboard = json.load(file) def get_expressions(obj, search_key, my_list=[]): if isinstance(obj, list) and len(obj): for item in obj: get_expressions(item, search_key, my_list) elif isinstance(obj, dict): if search_key in obj and obj[search_key]: return my_list.append(obj[search_key]) else: for key, value in obj.items(): if (isinstance(value, list) or isinstance(value, dict)): get_expressions(value, search_key, my_list) return my_list result = get_expressions(dashboard, "expr") pretty_result = json.dumps(result, indent=2, sort_keys=True) print(pretty_result)
Output [ ... "node_memory_Shmem_bytes{instance=~\"$node:$port\",job=~\"$job\"}", "node_memory_ShmemHugePages_bytes{instance=~\"$node:$port\",job=~\"$job\"}", "node_memory_SUnreclaim_bytes{instance=~\"$node:$port\",job=~\"$job\"}", "node_memory_SReclaimable_bytes{instance=~\"$node:$port\",job=~\"$job\"}", "node_memory_VmallocChunk_bytes{instance=~\"$node:$port\",job=~\"$job\"}", "node_memory_VmallocTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"}", ... ]
Объяснение
- Функция получает объект (Dict/list/int/jove) и проверяет, если это непустой список, а затем для каждого элемента в этом списке он выполняет ту же функцию (рекурсион)
- Как только звонок на
obj
Тип диктома (Элиф), мы проверяем Еслиsearch_key
находится в дикторе, если это, ура, добавьте кмой список
(начинается как пустой список) и вернуть my_list (состояние остановки) - (остальное в Элифу) Если
search_key
Не находится в диктоме, нам нужно пройти все ключи в диктоме (так же, как мы сделали в списке), если значение в Dict – это тип списка или Dict, выполнить функцию снова (рекурсион) - В конце концов вернуться
my_list
который начинается как пустой список по умолчанию и заканчивается списком значений, которые мы искали (состояние остановки)
Я надеюсь, что это было достаточно ясно …:)
Оригинал: “https://dev.to/unfor19/i-used-a-recursion-here-s-why-and-how-i-solved-it-1b0m”