Bagaimana saya bisa menganalisis kode Python untuk mengidentifikasi area bermasalah?

99

Saya memiliki repositori sumber besar yang dibagi menjadi beberapa proyek. Saya ingin membuat laporan tentang kesehatan kode sumber, mengidentifikasi area masalah yang perlu ditangani.

Secara khusus, saya ingin menyebutkan rutinitas dengan kompleksitas siklomatik tinggi, mengidentifikasi pengulangan, dan mungkin menjalankan beberapa analisis statis seperti serat untuk menemukan konstruksi yang mencurigakan (dan kemungkinan besar keliru).

Bagaimana saya bisa membuat laporan seperti itu?

Jerub
sumber

Jawaban:

36

Untuk mengukur kompleksitas siklomatik, ada alat bagus yang tersedia di traceback.org . Halaman tersebut juga memberikan gambaran yang baik tentang bagaimana menafsirkan hasil.

1 untuk pilint . Ini bagus dalam memverifikasi kepatuhan terhadap standar pengkodean (baik itu PEP8 atau varian organisasi Anda sendiri), yang pada akhirnya dapat membantu mengurangi kompleksitas siklus.

Mike Griffith
sumber
4
traceback.org adalah tautan rusak
denfromufa
Pylint memang bagus, tapi lambat. Kami menggunakan sebagai pengait pra-dorong, tetapi menggunakan flake8 dan banyak plugin untuk pemeriksaan reguler dan pengait pra-komitmen. Saya sebenarnya akan merekomendasikan https://flakehell.readthedocs.io/config.htmlhari ini, karena model eksekusinya jauh lebih kuat dan dapat dikonfigurasi.
DylanYoung
29

Untuk kompleksitas siklomatik, Anda dapat menggunakan radon: https://github.com/rubik/radon

(Gunakan pipuntuk menginstalnya: pip install radon)

Selain itu, ia juga memiliki fitur-fitur berikut:

  • metrik mentah (ini termasuk SLOC, baris komentar, baris kosong, & c.)
  • Metrik Halstead (semuanya)
  • Maintainability Index (yang digunakan di Visual Studio)
Dave Halter
sumber
Apa sakelar untuk mendapatkan metrik Halstead?
Dima Tisnek
1
@qarma Jika saya memahami dokumennya, saya rasa Anda tidak dapat menggunakan baris perintah. Anda harus menggunakan API Python.
Dave Halter
18

Untuk analisis statis ada pylint dan pychecker . Secara pribadi saya menggunakan pylint karena tampaknya lebih komprehensif daripada pychecker.

Untuk kompleksitas siklomatis Anda dapat mencoba program perl ini , atau artikel ini yang memperkenalkan program python untuk melakukan hal yang sama

ruang bebas
sumber
11

Pycana bekerja seperti pesona saat Anda perlu memahami proyek baru!

PyCAna (Python Code Analyzer) adalah nama keren untuk penganalisis kode sederhana untuk python yang membuat diagram kelas setelah menjalankan kode Anda.

Lihat cara kerjanya: http://pycana.sourceforge.net/

keluaran:

teks alt

msemelman.dll
sumber
6

Gunakan flake8 , yang menyediakan analisis kompleksitas pep8, pyflakes, dan cyclomatic dalam satu alat

Wes Kendall
sumber
4

Ada alat bernama CloneDigger yang membantu Anda menemukan cuplikan kode serupa.

Anonim
sumber
1
Itu tidak bekerja dengan Python 3 dan tidak pernah dipelihara dengan baik.
Acumenus
3

Untuk memeriksa kompleksitas siklomatik, tentu saja ada mccabepaketnya.

Instalasi:

$ pip install --upgrade mccabe

Pemakaian:

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

Perhatikan ambang 6 di atas. Berdasarkan jawaban ini , skor> 5 mungkin harus disederhanakan.

Output sampel dengan --min=3:

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

Secara opsional juga dapat digunakan melalui pylint-mccabe atau pytest-mccabe , dll.

Acumenus
sumber