try/except TypeError as e: — обработка исключения.
Рекурсия: базовый случай + рекурсивный вызов.
f"{prefix}.{key}" — сборка составного ключа.
dict.get("key", default) — безопасное чтение из словаря.
isinstance
Конструкция
Описание
Пример
isinstance(x, int)
Проверка одного типа
isinstance(5, int) → True
isinstance(x, (int, float))
Проверка нескольких типов
isinstance(3.14, (int, float)) → True
isinstance(x, list)
Проверка списка
isinstance([], list) → True
isinstance(x, dict)
Проверка словаря
isinstance({}, dict) → True
Рекурсия
Элемент
Назначение
Пример
Базовый случай
Остановка рекурсии
if not numbers: return 0
Рекурсивный шаг
Вызов себя с меньшими данными
return numbers[0] + recursive_sum(numbers[1:])
Глубина стека
Лимит вызовов Python
Превышение → RecursionError
Исключения
Исключение
Когда возникает
Когда использовать
TypeError
Неверный тип аргумента
Валидация типов через isinstance
ValueError
Некорректное значение
Значение верного типа, но не подходит по смыслу
RecursionError
Переполнение стека
Слишком глубокая рекурсия
raise
Конструкция
Описание
Пример
raise TypeError("msg")
Возбудить исключение
Проверка типа аргумента
raise
Повторно возбудить текущее исключение
В блоке except после логирования
Паттерны валидации
def validate_list_of_numbers(items: list) -> None:
if not isinstance(items, list):
raise TypeError("Expected a list")
for item in items:
if not isinstance(item, (int, float)):
raise TypeError(f"Expected numbers, got {type(item).__name__}")
def validate_department(department: dict) -> None:
if not isinstance(department, dict):
raise TypeError("Department must be a dict")
sub_departments = department.get("sub_departments")
if sub_departments is not None and not isinstance(sub_departments, list):
raise TypeError("sub_departments must be a list")
⚠️ Проверить по документации: вспомогательные функции валидации и type hints не разбираются в исходном практикуме, но являются стандартным подходом в современном Python.