defaultdict(int) подходит для суммирования числа уязвимостей по device_id. Но пагинации нужны timeout, проверка HTTP/JSON, корректного more и предел страниц; иначе код может зависнуть или молча исказить итог.
Определение уязвимых устройств по CVE
defaultdict(int) подходит для суммирования числа уязвимостей по device_id. Но пагинации нужны timeout, проверка HTTP/JSON, корректного more и предел страниц; иначе код может зависнуть или молча исказить итог.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо построить структуру данных, в которой каждому идентификатору устройства (device_id) будет сопоставлено количество уязвимостей, обнаруженных для него. Ниже приведён пример реализации, который последовательно запрашивает страницы API, считает количество уязвимостей в каждом ответе и формирует итоговый словарь, а также суммарное количество уязвимостей.
def process_paginated_response(content, res):
total = 0
for item in content:
device_id = item["device_id"]
vuln_num = len(item["vulnerabilities"])
res[device_id] += vuln_num
total += vuln_num
return total
res = defaultdict(int)
total_ = 0
page_number = 1
while True:
url = f"{base_url}?page_number={page_number}"
content_ = requests.get(url, auth=(username, password)).json()
total_ += process_paginated_response(content_["results"], res)
if content_["more"] is False:
break
page_number += 1
print(json.dumps(dict(res), indent=4))
print(total_)
Ответ
defaultdict(int) подходит для суммирования числа уязвимостей по device_id. Но пагинации нужны timeout, проверка HTTP/JSON, корректного more и предел страниц; иначе код может зависнуть или молча исказить итог.
Счётчик len(item['vulnerabilities']) считает записи, не обязательно уникальные CVE. Если один CVE повторяется на страницах, для уникального количества храните множество идентификаторов CVE на устройство. Сумма по устройствам также не равна числу уникальных CVE во всей системе.
Используйте HTTPS, Session, params={'page_number': page_number}, raise_for_status и валидацию структуры ответа. Строго проверяйте, что more — bool: выражение is False не остановится на строке 'false'. Ограничьте страницы и повторы, не логируйте credentials. Для меняющихся данных предпочтителен стабильный cursor/snapshot API.