Как я могу проанализировать код Python для выявления проблемных областей?

У меня большой репозиторий исходного кода, разделенный на несколько проектов. Я хотел бы подготовить отчет о состоянии исходного кода с указанием проблемных областей, которые необходимо решить.

В частности, я хотел бы вызвать подпрограммы с высокой цикломатической сложностью, идентифицировать повторы и, возможно, выполнить некоторый статический анализ, похожий на ворсинку, чтобы обнаружить подозрительные (и, следовательно, вероятно, ошибочные) конструкции.

Как я могу пойти о создании такого отчета?