Jak mogę przeanalizować kod Pythona, aby zidentyfikować problematyczne obszary?

99

Mam duże repozytorium źródłowe podzielone na wiele projektów. Chciałbym sporządzić raport na temat stanu kodu źródłowego, identyfikując obszary problemowe, którymi należy się zająć.

W szczególności chciałbym przywołać procedury o dużej cyklicznej złożoności, zidentyfikować powtórzenia i być może przeprowadzić statyczną analizę podobną do kłaczków, aby wykryć podejrzane (a zatem prawdopodobnie błędne) konstrukcje.

Jak mogę zabrać się do tworzenia takiego raportu?

Jerub
źródło

Odpowiedzi:

36

Na stronie traceback.org dostępne jest przydatne narzędzie do pomiaru złożoności cyklicznej . Strona zawiera również dobry przegląd sposobu interpretacji wyników.

+1 za pylint . Świetnie sprawdza się w sprawdzaniu zgodności ze standardami kodowania (czy to PEP8, czy wariantem Twojej organizacji), co ostatecznie może pomóc zredukować cykliczną złożoność.

Mike Griffith
źródło
4
traceback.org to uszkodzony link
denfromufa
Pylint jest świetny, ale powolny. Używamy go jako haka przed wypychaniem, ale używamy flake8 i zestawu wtyczek do regularnego sprawdzania i przechwytywania przed zatwierdzeniem. Właściwie to polecałbym https://flakehell.readthedocs.io/config.htmlte dni, ponieważ jego model wykonania jest znacznie bardziej niezawodny i konfigurowalny.
DylanYoung
29

Dla złożoności cyklomatycznej możesz użyć radon: https://github.com/rubik/radon

(Użyj pipgo zainstalować: pip install radon)

Dodatkowo ma również następujące funkcje:

  • surowe dane (obejmują SLOC, wiersze komentarzy, puste wiersze itd.)
  • Metryki Halstead (wszystkie)
  • Indeks łatwości utrzymania (ten używany w programie Visual Studio)
Dave Halter
źródło
Jaka jest zmiana, aby uzyskać metryki Halstead?
Dima Tisnek
1
@qarma Jeśli rozumiem dokumenty, nie sądzę, abyś mógł używać wiersza poleceń. Musisz użyć API Pythona.
Dave Halter
18

Do analizy statycznej służy pylint i pychecker . Osobiście używam pylint, ponieważ wydaje się być bardziej wszechstronny niż pychecker.

W przypadku złożoności cyklicznej możesz wypróbować ten program w Perlu lub ten artykuł, który wprowadza program w Pythonie, który robi to samo

wolna przestrzeń
źródło
11

Pycana działa jak urok, gdy musisz zrozumieć nowy projekt!

PyCAna (Python Code Analyzer) to fantazyjna nazwa prostego analizatora kodu dla Pythona, który tworzy diagram klas po wykonaniu kodu.

Zobacz, jak to działa: http://pycana.sourceforge.net/

wynik:

tekst alternatywny

msemelman
źródło
6

Użyj flake8 , który zapewnia pep8, pyflakes i analizę złożoności cyklomatycznej w jednym narzędziu

Wes Kendall
źródło
4

Istnieje narzędzie o nazwie CloneDigger, które pomaga znaleźć podobne fragmenty kodu.

Anonimowy
źródło
1
Nie działa z Pythonem 3 i nigdy nie był dobrze utrzymany.
Acumenus
3

Do sprawdzenia cykliczności złożoności jest oczywiście mccabepakiet.

Instalacja:

$ pip install --upgrade mccabe

Stosowanie:

$ python -m mccabe --min=6 path/to/myfile.py

Zwróć uwagę na próg 6 powyżej. Zgodnie z tą odpowiedzią wyniki> 5 prawdopodobnie powinny zostać uproszczone.

Przykładowe dane wyjściowe z --min=3:

68:1: 'Fetcher.fetch' 3
48:1: 'Fetcher._read_dom_tag' 3
103:1: 'main' 3

Opcjonalnie może być również używany przez pylint-mccabe lub pytest-mccabe itp.

Acumenus
źródło