Pyanalyze adalah pemeriksa tipe semi-statis untuk kode python. Seperti tipe pemeriksa statis (misalnya, Mypy atau Pyright), ia mendeteksi kesalahan jenis dalam kode Anda sehingga bug dapat ditemukan sebelum mencapai produksi. Tidak seperti alat tersebut, bagaimanapun, ia mengimpor modulnya jenis pemeriksaan, memungkinkan Pyanalyze untuk memahami banyak konstruksi dinamis yang akan ditolak oleh pemeriksa jenis lain. Properti ini juga memungkinkan untuk memperluas Pyanalyze dengan plugin yang berinteraksi langsung dengan kode Anda.
Anda dapat menginstal pyanalyze dengan:
$ pip install pyanalyzeSetelah diinstal, Anda dapat menjalankan pyanalyze pada file atau paket Python sebagai berikut:
$ python -m pyanalyze file.py
$ python -m pyanalyze package/ Tetapi perhatikan bahwa ini akan mencoba mengimpor semua file Python yang dilewati. Jika Anda memiliki skrip yang melakukan operasi tanpa if __name__ == "__main__": blok, pyanalyze mungkin berakhir di luarnya.
Agar berhasil berjalan, Pyanalyze harus dapat mengimpor kode yang diperiksa. Untuk membuat pekerjaan ini, Anda mungkin harus secara manual menyesuaikan jalur impor Python menggunakan variabel lingkungan $PYTHONPATH .
Untuk eksperimen cepat, Anda juga dapat menggunakan opsi -c untuk langsung mengetik periksa kode:
$ python -m pyanalyze -c 'import typing; typing.reveal_type(1)'
Runtime type is 'int'
Revealed type is 'Literal[1]' (code: reveal_type)
In <code> at line 1
1: import typing; typing.reveal_type(1)
^
Pyanalyze memiliki sejumlah opsi baris perintah, yang dapat Anda lihat dengan menjalankan python -m pyanalyze --help . Yang penting termasuk -f , yang menjalankan prompt interaktif yang memungkinkan Anda memeriksa dan memperbaiki setiap kesalahan yang ditemukan oleh pyanalyze, dan --enable / --disable , yang memungkinkan dan menonaktifkan kode kesalahan spesifik.
Konfigurasi melalui file pyproject.toml juga didukung. Lihat dokumentasi untuk detailnya.
Salah satu cara utama untuk memperluas pyanalyze adalah dengan memberikan spesifikasi untuk fungsi tertentu. Ini memungkinkan Anda untuk menjalankan kode sewenang -wenang yang memeriksa argumen ke fungsi dan menimbulkan kesalahan jika ada sesuatu yang salah.
Sebagai contoh, misalkan basis kode Anda berisi database.run_query() yang mengambil sebagai argumen string SQL, seperti ini:
database . run_query ( "SELECT answer, question FROM content" ) Anda ingin mendeteksi kapan panggilan ke run_query() berisi SQL yang tidak valid secara sintaksis atau mengacu pada tabel atau kolom yang tidak ada. Anda dapat mengaturnya dengan kode seperti ini:
from pyanalyze . error_code import ErrorCode
from pyanalyze . signature import CallContext , Signature , SigParameter
from pyanalyze . value import KnownValue , TypedValue , AnyValue , AnySource , Value
from database import run_query , parse_sql
def run_query_impl ( ctx : CallContext ) -> Value :
sql = ctx . vars [ "sql" ]
if not isinstance ( sql , KnownValue ) or not isinstance ( sql . val , str ):
ctx . show_error (
"Argument to run_query() must be a string literal" ,
ErrorCode . incompatible_call ,
)
return AnyValue ( AnySource . error )
try :
parsed = parse_sql ( sql )
except ValueError as e :
ctx . show_error (
f"Invalid sql passed to run_query(): { e } " ,
ErrorCode . incompatible_call ,
)
return AnyValue ( AnySource . error )
# check that the parsed SQL is valid...
# pyanalyze will use this as the inferred return type for the function
return TypedValue ( list )
# in pyproject.toml, set:
# known_signatures = ["<module>.get_known_argspecs"]
def get_known_argspecs ( arg_spec_cache ):
return {
# This infers the parameter types and names from the function signature
run_query : arg_spec_cache . get_argspec (
run_query , impl = run_query_impl
),
# You can also write the signature manually
run_query : Signature . make (
[ SigParameter ( "sql" , annotation = TypedValue ( str ))],
callable = run_query ,
impl = run_query_impl ,
),
}Pyanalyze umumnya bertujuan untuk mengimplementasikan spesifikasi pengetikan Python, tetapi dukungan untuk beberapa fitur tidak lengkap. Lihat dokumentasi untuk detailnya.
Terkadang pyanalyze salah paham dan Anda perlu mengabaikan kesalahan yang dipancarkannya. Ini bisa dilakukan sebagai berikut:
# static analysis: ignore pada garis dengan sendirinya sebelum garis yang menghasilkan kesalahan.# static analysis: ignore di akhir baris yang menghasilkan kesalahan.# static analysis: ignore di bagian atas file; Ini akan mengabaikan kesalahan di seluruh file. Anda dapat menambahkan kode kesalahan, seperti # static analysis: ignore[undefined_name] , untuk mengabaikan hanya kode kesalahan tertentu. Ini tidak berfungsi untuk seluruh file yang diabaikan. Jika kode kesalahan bare_ignore dihidupkan, pyanalyze akan memancarkan kesalahan jika Anda tidak menentukan kode kesalahan pada komentar abaikan.
Pyanalyze saat ini tidak mendukung standar # type: ignore sintaksis komentar.
Pyanalyze mendukung semua versi Python yang belum mencapai akhir kehidupan. Karena mengimpor kode yang diperiksa, Anda harus menjalankannya menggunakan versi python yang sama yang Anda gunakan untuk menjalankan kode Anda.
Kami menyambut kontribusi Anda. Lihat Kontribusi.MD untuk Cara Memulai.
Dokumentasi tersedia di ReadThedocs atau di GitHub.