Anotasi, generics, dan Protocol baru benar-benar bernilai ketika ada checker yang menjaganya setiap hari. Dua nama menguasai ekosistem: mypy — checker tertua dan paling matang, dioperasikan lewat command line — dan Pyright dari Microsoft — bertenaga besar dan menjadi dasar ekstensi Python di VS Code. Chapter penutup ini mengoperasikan mypy secara nyata di terminal (sesi berikut dijalankan dengan mypy 2.4.0 pada Python 3.12), lalu memetakan posisi keduanya agar kita tahu kapan memakai yang mana.
Sesi mypy Pertama #
mypy telah terinstal sebagai package Python, jadi kita menjalankannya lewat python3 -m mypy. Simpan sebagai diskon.py:
def hitung_diskon(harga: int, persen: int) -> int:
return harga - harga * persen // 100
total = hitung_diskon("150000", 20)
print(total)Lalu jalankan:
python3 -m mypy --version
python3 -m mypy diskon.pyOutput yang Dihasilkan:
mypy 2.4.0 (compiled: yes)
diskon.py:4: error: Argument 1 to "hitung_diskon" has incompatible type "str"; expected "int" [arg-type]
Found 1 error in 1 file (checked 1 source file)Cara membaca laporannya: diskon.py:4 adalah berkas dan baris; error: menjelaskan pelanggaran; kode [arg-type] mengategorikannya. Baris terakhir merangkum jumlah temuan dan jumlah berkas yang diperiksa. Pola membaca ini sama untuk semua laporan mypy — sekali terbiasa, laporan apa pun langsung terbaca.
Mode –strict #
Sesi pertama tadi menunjukkan sifat penting mypy: secara bawaan, mypy cukup santai — function tanpa anotasi dilewati begitu saja. Simpan sebagai kasir.py:
def format_rupiah(nilai):
return f"Rp{nilai:,}".replace(",", ".")
def hitung_diskon(harga: int, persen: int) -> int:
return harga - harga * persen // 100
total = hitung_diskon(150000, 20)
print(format_rupiah(total))Dengan mode bawaan, berkas tersebut lolos:
python3 -m mypy kasir.pyOutput yang Dihasilkan:
Success: no issues found in 1 source fileSekarang naikkan ketegasannya:
python3 -m mypy --strict kasir.pyOutput yang Dihasilkan:
kasir.py:1: error: Function is missing a type annotation [no-untyped-def]
kasir.py:8: error: Call to untyped function "format_rupiah" in typed context [no-untyped-call]
Found 2 errors in 1 file (checked 1 source file)Mode --strict menyalakan puluhan pemeriksaan sekaligus: function wajib beranotasi, kode bertipe dilarang memanggil function tanpa tipe, Any tidak boleh menyebar, dan masih banyak lagi. Setelah format_rupiah diberi anotasi def format_rupiah(nilai: int) -> str:, pemeriksaan ulang menghasilkan Success: no issues found in 1 source file. Untuk project baru, banyak tim langsung memulai dari --strict — memperbaiki kebiasaan sejak awal lebih murah daripada mengejar utang anotasi di kemudian hari.
Konfigurasi di pyproject.toml #
Mengetik --strict setiap kali merepotkan, dan ketegasan perlu konsisten satu tim. Solusinya: simpan pengaturan di pyproject.toml pada root project:
[tool.mypy]
python_version = "3.12"
disallow_untyped_defs = true
warn_unused_ignores = truemypy otomatis menemukan pyproject.toml di direktori kerja (atau induknya), lalu menerapkan pengaturan tersebut tanpa flag apa pun. Contoh di atas menyalakan dua kebijakan populer dari kumpulan mode --strict: disallow_untyped_defs menolak def tanpa anotasi, dan warn_unused_ignores menandai # type: ignore yang sudah tidak diperlukan. Dengan berkas laporan.py yang masih memuat def format_rupiah(nilai): tanpa anotasi:
python3 -m mypy laporan.pyOutput yang Dihasilkan:
laporan.py:1: error: Function is missing a type annotation [no-untyped-def]
Found 1 error in 1 file (checked 1 source file)Perintahnya polos — seluruh ketegasan tinggal di config. Daftar lengkap opsi tersedia di python3 -m mypy --help dan dokumentasi resmi mypy.
mypy atau Pyright #
| Aspek | mypy | Pyright |
|---|---|---|
| Pengembang | Komunitas open source (asalnya Dropbox) | Microsoft |
| Bentuk utama | CLI: python3 -m mypy ... | Language server; CLI pyright via npm |
| Kecepatan | Cukup; mode inkremental membantu | Sangat cepat, ditulis dalam TypeScript |
| Tempat alami | CI, pre-commit hook, terminal | VS Code (ekstensi Pylance memakainya) |
| Ketelitian | Matang, konservatif, penuh opsi | Agak lebih ketat pada beberapa kasus |
Keduanya memahami anotasi yang sama — list[int], X | None, Protocol, overload — sehingga keputusannya bukan “tata bahasa berbeda”, melainkan “di mana pemeriksaan berlangsung”. Pyright tidak terinstal pada lingkungan latihan kita, jadi penjelasan untuk bagian ini bersifat konseptual: pada VS Code, Pylance menampilkan hasil Pyright secara langsung di editor — galat ditandai dengan garis bergerigi saat kita mengetik, tanpa perintah terminal. Pengalaman balikan instan semacam ini membuat Pyright populer sebagai “checker sambil menulis”, sementara mypy menjalankan peran “penjaga gerbang” ketika kode hendak digabung.
Praktik umum keduanya saling melengkapi: Pyright menemani saat menulis, mypy memeriksa ulang seluruh project pada integrasi berkelanjutan (CI) — misalnya satu langkah pipeline yang menjalankan python3 -m mypy . dan menggagalkan penggabungan bila ada error. Dua checker bisa berbeda pendapat pada kasus tepi; jika itu terjadi, pilih aturan yang lebih ketat dan jadikan keputusan itu konfigurasi, bukan perdebatan berulang.
Dengan ini kita menutup Section Type Hints dan Static Analysis. Anotasi yang kita tulis kini punya penjaga: editor saat mengetik, checker saat memeriksa, dan CI sebelum kode menyatu.