Hering menemukan kode yang tidak digunakan dalam program Python. Ini berguna untuk membersihkan dan menemukan kesalahan dalam basis kode yang besar. Jika Anda menjalankan Vulture di perpustakaan dan rangkaian pengujian, Anda dapat menemukan kode yang belum diuji.
Karena sifat dinamis Python, penganalisis kode statis seperti Vulture kemungkinan besar melewatkan beberapa kode mati. Selain itu, kode yang hanya dipanggil secara implisit mungkin dilaporkan sebagai tidak digunakan. Meskipun demikian, Vulture dapat menjadi alat yang sangat berguna untuk kualitas kode yang lebih tinggi.
--sort-by-size
$ pip install vulture
$ vulture myscript.py # or
$ python3 -m vulture myscript.py
$ vulture myscript.py mypackage/
$ vulture myscript.py --min-confidence 100 # Only report 100% dead code.
Argumen yang diberikan mungkin berupa file atau direktori Python. Untuk setiap direktori, Vulture menganalisis semua file *.py yang ada di dalamnya.
Setelah Anda menemukan dan menghapus kode mati, jalankan kembali Vulture, karena mungkin akan menemukan lebih banyak kode mati.
Selain menemukan fungsi, kelas, dll. yang tidak digunakan, Vulture dapat mendeteksi kode yang tidak dapat dijangkau. Setiap potongan kode yang mati diberi nilai keyakinan antara 60% dan 100%, di mana nilai 100% menandakan bahwa kode tersebut pasti tidak akan dieksekusi. Nilai di bawah 100% merupakan perkiraan kasar (berdasarkan jenis potongan kode) mengenai seberapa besar kemungkinan kode tersebut tidak digunakan.
Jenis kode | Nilai kepercayaan diri |
---|---|
argumen fungsi/metode/kelas, kode tidak dapat dijangkau | 100% |
impor | 90% |
atribut, kelas, fungsi, metode, properti, variabel | 60% |
Anda dapat menggunakan tanda --min-confidence
untuk menetapkan keyakinan minimum agar kode dilaporkan sebagai tidak digunakan. Gunakan --min-confidence 100
untuk hanya melaporkan kode yang dijamin tidak digunakan dalam file yang dianalisis.
Ketika Vulture salah melaporkan potongan kode sebagai tidak digunakan, Anda memiliki beberapa opsi untuk menyembunyikan kesalahan positif. Jika memperbaiki kesalahan positif Anda juga dapat bermanfaat bagi pengguna lain, harap ajukan laporan masalah.
Opsi yang disarankan adalah menambahkan kode bekas yang dilaporkan sebagai tidak terpakai ke modul Python dan menambahkannya ke daftar jalur yang dipindai. Untuk mendapatkan daftar putih tersebut secara otomatis, teruskan --make-whitelist
ke Vulture:
$ vulture mydir --make-whitelist > whitelist.py
$ vulture mydir whitelist.py
Perhatikan bahwa file whitelist.py
yang dihasilkan akan berisi sintaksis Python yang valid, tetapi agar Python dapat menjalankannya , Anda biasanya harus melakukan beberapa modifikasi.
Kami mengumpulkan daftar putih untuk modul dan paket Python umum di vulture/whitelists/
(permintaan tarik dipersilakan).
Jika Anda ingin mengabaikan seluruh file atau direktori, gunakan parameter --exclude
(misalnya, --exclude "*settings.py,*/docs/*.py,*/test_*.py,*/.venv/*.py"
). Pola pengecualian dicocokkan dengan jalur absolut.
Untuk kompatibilitas dengan flake8, Vulture mendukung kode kesalahan F401 dan F841 untuk mengabaikan impor yang tidak digunakan ( # noqa: F401
) dan variabel lokal yang tidak digunakan ( # noqa: F841
). Namun, kami merekomendasikan penggunaan daftar putih daripada komentar noqa
, karena komentar noqa
menambah gangguan visual pada kode dan membuatnya lebih sulit dibaca.
Anda dapat menggunakan --ignore-names foo*,ba[rz]
untuk membiarkan Vulture mengabaikan semua nama yang dimulai dengan foo
dan nama bar
dan baz
. Selain itu, opsi --ignore-decorators
dapat digunakan untuk mengabaikan nama fungsi yang didekorasi dengan dekorator tertentu (tetapi bukan argumen atau isi fungsinya). Hal ini berguna misalnya dalam proyek Flask, di mana Anda dapat menggunakan --ignore-decorators "@app.route"
untuk mengabaikan semua nama fungsi dengan dekorator @app.route
. Perhatikan bahwa Vulture menyederhanakan dekorator yang tidak dapat diurai: @foo.bar(x, y)
menjadi "@foo.bar" dan @foo.bar(x, y).baz
menjadi "@" secara internal.
Kami merekomendasikan penggunaan daftar putih daripada --ignore-names
atau --ignore-decorators
bila memungkinkan, karena daftar putih secara otomatis diperiksa kebenaran sintaksisnya ketika diteruskan ke Vulture dan sering kali Anda bahkan dapat meneruskannya ke juru bahasa Python Anda dan membiarkannya memeriksa apakah semuanya masuk daftar putih kode sebenarnya masih ada di proyek Anda.
Ada situasi di mana Anda tidak bisa menghapus variabel yang tidak digunakan begitu saja, misalnya dalam tanda tangan fungsi. Solusi yang disarankan adalah dengan menggunakan kata kunci del
seperti yang dijelaskan dalam manual PyLint dan di StackOverflow:
def foo ( x , y ):
del y
return x + 3
Vulture juga akan mengabaikan semua variabel yang dimulai dengan garis bawah, sehingga Anda dapat menggunakan _x, y = get_pos()
untuk menandai penetapan tuple atau argumen fungsi yang tidak digunakan, misalnya def foo(x, _y)
.
Naikkan nilai keyakinan minimum dengan tanda --min-confidence
.
Jika Vulture mengeluh tentang kode seperti if False:
, Anda dapat menggunakan flag Boolean debug = False
dan menulis if debug:
sebagai gantinya. Hal ini membuat kode lebih mudah dibaca dan membungkam Vulture.
Lihat #216. Misalnya, daripada def foo(arg: "Sequence"): ...
, sebaiknya gunakan
from __future__ import annotations
def foo ( arg : Sequence ):
...
Anda juga dapat menyimpan argumen baris perintah di pyproject.toml
di bawah bagian tool.vulture
. Cukup hapus tanda hubung di depan dan ganti semua tanda hubung yang tersisa dengan garis bawah.
Opsi yang diberikan pada baris perintah lebih diutamakan daripada opsi di pyproject.toml
.
Contoh Konfigurasi:
[ tool . vulture ]
exclude = [ " *file*.py " , " dir/ " ]
ignore_decorators = [ " @app.route " , " @require_* " ]
ignore_names = [ " visit_* " , " do_* " ]
make_whitelist = true
min_confidence = 80
paths = [ " myscript.py " , " mydir " , " whitelist.py " ]
sort_by_size = true
verbose = true
Vulture akan secara otomatis mencari pyproject.toml
di direktori kerja saat ini.
Untuk menggunakan pyproject.toml
di direktori lain, Anda dapat menggunakan flag --config path/to/pyproject.toml
.
Anda dapat menggunakan hook pra-komit untuk menjalankan Vulture sebelum setiap komit. Untuk melakukan ini, instal pre-commit dan tambahkan yang berikut ini ke file .pre-commit-config.yaml
di repositori Anda:
repos :
- repo : https://github.com/jendrikseipp/vulture
rev : ' v2.3 ' # or any later Vulture version
hooks :
- id : vulture
Kemudian jalankan pre-commit install
. Terakhir, buat file pyproject.toml
di repositori Anda dan tentukan semua file yang harus diperiksa Vulture di bawah [tool.vulture] --> paths
(lihat di atas).
Ada juga GitHub Action for Vulture dan Anda dapat menggunakan Vulture secara terprogram. Misalnya:
import vulture
v = vulture . Vulture ()
v . scavenge ([ '.' ])
unused_code = v . get_unused_code () # returns a list of `Item` objects
Vulture menggunakan modul ast
untuk membangun pohon sintaksis abstrak untuk semua file tertentu. Saat melintasi semua pohon sintaksis, ia mencatat nama objek yang ditentukan dan digunakan. Setelah itu, ia melaporkan objek yang telah ditentukan, tetapi tidak digunakan. Analisis ini mengabaikan cakupan dan hanya memperhitungkan nama objek.
Vulture juga mendeteksi kode yang tidak dapat dijangkau dengan mencari kode setelah pernyataan return
, break
, continue
dan raise
, dan dengan mencari kondisi if
- dan while
- yang tidak dapat dipenuhi.
Saat menggunakan opsi --sort-by-size
, Vulture mengurutkan kode yang tidak digunakan berdasarkan jumlah barisnya. Ini membantu pengembang memprioritaskan tempat mencari kode mati terlebih dahulu.
Perhatikan skrip Python berikut ( dead_code.py
):
import os
class Greeter :
def greet ( self ):
print ( "Hi" )
def hello_world ():
message = "Hello, world!"
greeter = Greeter ()
func_name = "greet"
greet_func = getattr ( greeter , func_name )
greet_func ()
if __name__ == "__main__" :
hello_world ()
Panggilan :
$ vulture dead_code.py
menghasilkan output berikut:
dead_code.py:1: unused import 'os' (90% confidence)
dead_code.py:4: unused function 'greet' (60% confidence)
dead_code.py:8: unused variable 'message' (60% confidence)
Hering dengan benar melaporkan os
dan message
sebagai tidak digunakan tetapi gagal mendeteksi bahwa greet
sebenarnya digunakan. Metode yang disarankan untuk menangani positif palsu seperti ini adalah dengan membuat file Python daftar putih.
Mempersiapkan daftar putih
Dalam daftar putih kami menyimulasikan penggunaan variabel, atribut, dll. Untuk program di atas, daftar putih dapat terlihat seperti berikut:
# whitelist_dead_code.py
from dead_code import Greeter
Greeter . greet
Alternatifnya, Anda dapat meneruskan --make-whitelist
ke Vulture dan mendapatkan daftar putih yang dibuat secara otomatis.
Meneruskan program asli dan daftar putih ke Vulture
$ vulture dead_code.py whitelist_dead_code.py
membuat Vulture mengabaikan metode greet
:
dead_code.py:1: unused import 'os' (90% confidence)
dead_code.py:8: unused variable 'message' (60% confidence)
Kode keluar | Keterangan |
---|---|
0 | Tidak ada kode mati yang ditemukan |
1 | Input tidak valid (file hilang, kesalahan sintaksis, pengkodean salah) |
2 | Argumen baris perintah tidak valid |
3 | Kode mati ditemukan |
Silakan kunjungi https://github.com/jendrikseipp/vulture untuk melaporkan masalah apa pun atau membuat permintaan penarikan.