4 Pemeriksa jenis Python untuk memastikan kod anda bersih

Pada mulanya, Python tidak mempunyai hiasan jenis. Itu sesuai dengan tujuan keseluruhan untuk menjadikan bahasa cepat dan mudah digunakan, dengan jenis objek fleksibel yang sesuai dengan kelainan menulis kod dan membantu pembangun menyimpan kod mereka ringkas.

Namun, sejak beberapa tahun kebelakangan ini, Python telah menambahkan sokongan untuk anotasi jenis, yang mengilhami budaya perisian yang dikhaskan untuk memeriksa jenis Python semasa pembangunan. Python tidak memeriksa jenis pada waktu berjalan - sekurang-kurangnya, belum. Tetapi dengan memanfaatkan pemeriksa jenis yang baik, menunggang senapang dengan IDE pilihan anda, anda boleh menggunakan anotasi jenis Python untuk menyaring banyak kesilapan biasa sebelum berlaku.

Dalam artikel ini kita akan membahas empat daripada jenis pengaya tambahan untuk Python. Semua mengikuti corak yang hampir sama, mengimbas kod Python dengan anotasi jenis dan memberikan maklum balas. Tetapi masing-masing menawarkan penambahan berguna untuk konsep asas.

Mypy

Mypy boleh dikatakan sistem pemeriksaan jenis statik pertama untuk Python, kerana pekerjaan di atasnya bermula pada tahun 2012, dan ia masih dalam proses aktif. Ini pada dasarnya adalah prototaip untuk bagaimana perpustakaan memeriksa jenis pihak ketiga berfungsi di Python, walaupun banyak yang lain sejak itu dan memperluas ciri-cirinya.

Mypy boleh berjalan secara mandiri, atau dari baris arahan, atau ia boleh berfungsi sebagai sebahagian daripada penyunting atau penyatuan IDE. Banyak editor dan IDE mengintegrasikan Mypy; Sambungan Python Visual Studio Code boleh berfungsi dengannya secara langsung. Semasa dijalankan, Mypy menghasilkan laporan mengenai ketekalan kod anda berdasarkan jenis maklumat yang diberikannya.

Sekiranya kod anda tidak termasuk anotasi jenis, Mypy tidak akan melakukan sebahagian besar pemeriksaan kodnya. Walau bagaimanapun, anda boleh menggunakan Mypy untuk menandakan kod tanpa nama. Ini dapat dilakukan dengan tahap ketegangan yang berbeza-beza bergantung pada keperluan seseorang.

Sekiranya anda bermula dari awal dengan pangkalan kode dan anda mahukan strategi penyewaan yang lebih agresif, anda boleh menggunakan --strictpilihan untuk mengelakkan kod yang tidak diketik. Sebaliknya, jika anda bekerja dengan pangkalan data lama yang tidak mempunyai banyak definisi jenis, anda boleh menggunakan pilihan yang lebih santai seperti mencegah hanya definisi fungsi yang belum diketik dengan  --disallow-untyped-defs membenarkan kod yang tidak diketik. Dan anda selalu boleh menggunakan komen sebaris seperti # type: ignoreuntuk mengelakkan baris individu tidak ditandai.

Mypy boleh menggunakan fail stub PEP 484 apabila anda ingin menggunakan petunjuk jenis untuk antara muka umum modul. Selain itu, Mypy menawarkan stubgen, alat yang menghasilkan fail stub secara automatik dari kod yang ada. Untuk kod yang tidak diketik, stub file menggunakan jenis generik, yang kemudian anda boleh tandai mengikut keperluan.

Jenis Paip

Pytype, yang dibuat oleh Google, berbeza dengan yang serupa dengan Mypy dalam menggunakan inferensi dan bukan hanya deskriptor jenis. Dengan kata lain, Pytype cuba menentukan jenis dengan menganalisis aliran kod, dan bukannya bergantung sepenuhnya pada anotasi jenis.

Paip salah di sisi kelonggaran setiap kali masuk akal untuk melakukannya. Sekiranya anda mempunyai operasi yang berfungsi pada waktu runtime dan tidak bertentangan dengan anotasi apa pun, Pytype tidak akan membantahnya. Namun, ini bermaksud bahawa beberapa masalah yang harus ditandai (misalnya, menyatakan pemboleh ubah dengan jenis pada satu titik dan kemudian mentakrifkannya semula dalam konteks yang sama) berlalu tanpa diumumkan. Dokumentasi menyatakan bahawa perkara-perkara seperti itu akan dilarang pada suatu masa nanti.

Sekiranya anda memilih untuk menambahkan anotasi jenis pada kod anda, reveal_typefungsi Pytype  sangat berguna. Sekiranya anda memasukkan pernyataan dalam kod anda yang berbunyi reveal_type(expr), Pytype akan menilai exprdan mengeluarkan amaran yang menerangkan jenisnya. 

Perhatikan bahawa tingkah laku Pytype tertentu dikendalikan dengan menambahkan atribut ke kod itu sendiri. Sebagai contoh, jika anda ingin menghentikan Pytype daripada mengeluh tentang atribut yang hilang atau anggota modul yang ditetapkan secara dinamis, anda harus menambahkan atribut _HAS_DYNAMIC_ATTRIBUTES = Trueke kelas atau modul yang dimaksud, dan bukannya menetapkan beberapa jenis metadata konfigurasi Pytype.

Pyright / Pylance

Pyright adalah pemeriksa jenis Microsoft Python, termasuk sebagai sebahagian daripada peluasan Pylance untuk Visual Studio Code. Sekiranya anda sudah menjadi pengguna Kod VS, sambungan Pylance adalah kaedah paling senang untuk bekerjasama dengan Pyright; pasang saja dan pergi. Pyright memberikan pengalaman pemeriksaan dan pengilangan kod jenis all-in-one yang baik, dengan banyak kemudahan dan kemajuan yang sama seperti alat analisis Python sebelumnya.

Seperti Pytype, Pyright dapat berfungsi dengan pangkalan data yang tidak mempunyai maklumat jenis. Dalam kes tersebut, Pyright akan melakukan yang terbaik untuk menyimpulkan jenis apa yang sedang dimainkan. Oleh itu, anda masih boleh memperoleh keputusan yang baik dengan Pytype pada pangkalan data yang lebih lama tanpa pernyataan jenis. Tetapi anda akan mendapat hasil yang lebih baik dari masa ke masa semasa anda menambahkan anotasi jenis pada kod anda secara bertahap.

Pyright sangat fleksibel dengan cara yang melengkapkan reka bentuk projek Python dunia nyata. Seperti pemeriksa jenis lain, Pyright dapat dikonfigurasi berdasarkan setiap proyek dengan file konfigurasi berformat JSON di direktori proyek. Laluan individu dapat dikecualikan (tidak pernah diperiksa) atau diabaikan (kesalahan dan peringatan ditekan) dalam fail konfigurasi, dan pilihannya sangat terperinci.

Dalam Kod VS, ruang kerja dengan pelbagai akar masing-masing boleh mempunyai konfigurasi Pyright mereka sendiri, sekiranya bahagian-bahagian projek yang berbeza memerlukan konfigurasi serat yang berbeza. Dengan cara yang sama, anda dapat menentukan beberapa "lingkungan pelaksanaan" dalam sebuah projek, masing-masing dengan jalan sendiri atau jalur import.

Pyre 

Dicipta oleh pembangun di Facebook dan Instagram, Pyre sebenarnya adalah dua alat dalam satu: pemeriksa jenis (Pyre) dan alat analisis kod statik (Pysa). Kedua-duanya dirancang untuk bekerja secara beriringan untuk memberikan tahap pemeriksaan dan analisis yang lebih tinggi daripada alat lain, walaupun pengguna perlu melakukan sedikit angkat berat untuk memanfaatkan sepenuhnya.

Pyre mengambil pendekatan yang serupa dengan Pytype dan Mypy. Kod yang tidak diketik ditangani dengan lebih lembut daripada kod yang ditaip, jadi anda boleh memulakan dengan pangkalan data Python yang tidak diketik dan menambahkan fungsi anotasi mengikut fungsi dan modul mengikut modul. Beralih pada "mode ketat" dalam modul, dan Pyre akan menandakan sebarang anotasi yang hilang. Atau anda boleh menjadikan mod ketat sebagai lalai dan memilih keluar pada tahap modul. Pyre juga akan berfungsi dengan fail stub format .pyi.

Pyre mempunyai ciri kuat untuk memindahkan pangkalan kode ke format yang ditaip. The inferbaris arahan B. mengambil pilihan fail atau direktori, membuat berpendidikan tekaan mengenai jenis digunakan, dan boleh digunakan penjelasan kepada fail. Anda pasti ingin membuat sandaran kod anda terlebih dahulu! (Sekiranya anda ingin mendapatkan maklumat jenis dari program Python yang sedang berjalan , anda boleh melakukannya dengan projek Facebook / Instagram lain, MonkeyType.)

Walaupun ciri-ciri Pyre serupa dengan pakej lain yang diperincikan di sini, Pysa adalah unik. Pysa melakukan "analisis taint" pada kod untuk mengenal pasti masalah keamanan yang berpotensi, bergantung pada perpustakaan analisis aliran untuk komponen perisian tertentu dan kod penanda yang nampaknya rentan. Apa sahaja yang disentuh oleh kod itu juga akan ditandai sebagai dicemari, walaupun anda dapat menentukan komponen yang membersihkan data dan membuang data tersebut dari grafik taint.

Satu kelemahannya adalah bahawa pustaka analisis warna komponen Pysa masih kecil, jadi anda mungkin perlu merangka model anda sendiri. Tetapi banyak analisis taint adalah untuk perisian yang banyak digunakan, seperti kerangka web Django, SQL Alchemy ORM, dan perpustakaan sains data Pandas, belum lagi analisis untuk masalah sistem fail umum.

Bagaimana untuk melakukan lebih banyak perkara dengan Python

  • Cara bekerja dengan jenis data senarai Python
  • Cara mengemas aplikasi Python dengan BeeWare Briefcase
  • Cara menjalankan Anaconda berdampingan dengan Pythons yang lain
  • Cara menggunakan cermin mata hitam Python
  • Mulakan dengan async di Python
  • Cara menggunakan asyncio di Python
  • 3 langkah untuk baik pulih async Python
  • Cara menggunakan PyInstaller untuk membuat Python yang boleh dilaksanakan
  • Tutorial Cython: Cara mempercepat Python
  • Cara memasang Python dengan cara yang bijak
  • Cara menguruskan projek Python dengan Puisi
  • Cara menguruskan projek Python dengan Pipenv
  • Virtualenv dan venv: Persekitaran maya Python dijelaskan
  • Python virtualenv dan venv lakukan dan tidak boleh dilakukan
  • Penjelasan dan proses subtitle Python dijelaskan
  • Cara menggunakan debugger Python
  • Cara menggunakan timeit untuk profil kod Python
  • Cara menggunakan cProfile untuk profil kod Python
  • Cara menukar Python ke JavaScript (dan kembali lagi)