Год назад проходил челлендж Python Type Challenges по типизации в Python, и недавно снова про него вспомнил. Задачи решаются прямо в браузере.

Если интересно как предотвращать ситуации SQL-инъекций вроде execute_query(f"SELECT … {user_id}"), что такое протоколы или перегрузка функций, то стоит попробовать.

Четыре уровня сложности: от простых int | None до экстремальных задач про декораторы, модифицирующие аргументы.

Разбор с решениями можно посмотреть тут