/
kremls
/
python-course-junior
Обзор
Документация
Войти
/
kremls
/
python-course-junior
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
02-lessons/day-004/tempCodeRunnerFile.py
103 строки
4 KB
kremls
done day-004
16 май 2026, 15:30
16 май 2026, 15:30
9681412
Код
Авторство
О чём код?
# 1. Что такое list comprehension? # Краткая форма реализации создания коллекций на основе других колекций, работает быстрее цикла # т.к. реализована на С # 2. Когда comprehension ухудшает читаемость? # Когда требуется сложная логика при создании коллекции или валидация # и обработка ошибок # 3. Что такое unpacking? # Присваивание переменным значения из колекции, по сути переменные здесь # это tuple # 4. Что произойдёт при несовпадении количества переменных и элементов? # Может быть брошено исключение # 5. Для чего нужен `enumerate`? # Распаковать коллекцию в индекс и значение # 6. Как начать нумерацию с 1? # передать аргумент enumerate(some_list, start=1) # 7. Что делает `zip`? # Объединяет коллекции в пары или tuple # 8. Что важно помнить про `zip`? # Обрежет по самой короткой коллекции # 9. Почему `zip` может быть опасен для сборки конфигураций? # Может быть потеряна часть конфигурации, если не сравнить длину # 10. Почему `enumerate` полезен для scanner-проекта? # Удобно считать строки кода def get_high_risk_rule_ids(findings: list[dict]) -> list: return [ finding.get("rule_id") for finding in findings if finding.get("severity") in {"HIGH", "CRITICAL"} ] def get_unique_severities(findings: list[dict]) -> set: return {finding.get("severity") for finding in findings} def build_rule_severity_map(findings: list[dict]): return {finding.get("rule_id"): finding.get("severity") for finding in findings} def parse_finding_key(raw: str) -> tuple[str, int, str] | None: if not isinstance(raw, str): return None parts = raw.split(":", 3) if len(parts) != 3: return None file_name, raw_line, rule_id = parts if not raw_line.isdigit(): return None if not isinstance(file_name, str) or not isinstance(rule_id, str): return None return file_name.strip(), int(raw_line), rule_id.strip() def build_rule_map(rule_ids: list[str], patterns: list[str]) -> dict[str, str]: if len(rule_ids) != len(patterns): raise ValueError ("rule_ids and patterns must have the same length") return dict(zip(rule_ids, patterns)) def find_eval_calls(lines: list[str]) -> list[dict]: rules = build_rule_map(RULE_IDS, RULE_PATTERNS) findings = [] for line_number, raw_line in enumerate(lines, start=1): for rule_id, pattern in rules.items(): if pattern in raw_line: findings.append({ "line": line_number, "rule_id": rule_id, "evidence": raw_line.strip() }) return findings RULE_IDS = [ "DANGEROUS_EVAL", "SHELL_TRUE", "HARDCODED_PASSWORD", ] RULE_PATTERNS = [ "eval(", "shell=True", "password =", ] findings = [ {"rule_id": "SQL_INJECTION", "severity": "HIGH"}, {"rule_id": "XSS", "severity": "MEDIUM"}, {"rule_id": "PATH_TRAVERSAL", "severity": "CRITICAL"}, {"rule_id": "RCE", "severity": "CRITICAL"}, {"rule_id": "SSRF", "severity": "MEDIUM"}, {"rule_id": "LOG_FORGING", "severity": "LOW"}, ] print(get_high_risk_rule_ids(findings)) print(get_unique_severities(findings)) print(build_rule_severity_map(findings)) print(parse_finding_key("app.py:42:SQL_INJECTION"))