Год назад проходил челлендж Python Type Challenges по типизации в Python, и недавно снова про него вспомнил. Задачи решаются прямо в браузере.
Если интересно как предотвращать ситуации SQL-инъекций вроде execute_query(f"SELECT … {user_id}"), что такое протоколы или перегрузка функций, то стоит попробовать.
Четыре уровня сложности: от простых int | None до экстремальных задач про декораторы, модифицирующие аргументы.
Разбор с решениями можно посмотреть тут