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:

python
def hitung_diskon(harga: int, persen: int) -> int:
    return harga - harga * persen // 100

total = hitung_diskon("150000", 20)
print(total)

Lalu jalankan:

bash
python3 -m mypy --version
python3 -m mypy diskon.py

Output yang Dihasilkan:

text
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:

python
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:

bash
python3 -m mypy kasir.py

Output yang Dihasilkan:

text
Success: no issues found in 1 source file

Sekarang naikkan ketegasannya:

bash
python3 -m mypy --strict kasir.py

Output yang Dihasilkan:

text
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:

toml
[tool.mypy]
python_version = "3.12"
disallow_untyped_defs = true
warn_unused_ignores = true

mypy 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:

bash
python3 -m mypy laporan.py

Output yang Dihasilkan:

text
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 #

AspekmypyPyright
PengembangKomunitas open source (asalnya Dropbox)Microsoft
Bentuk utamaCLI: python3 -m mypy ...Language server; CLI pyright via npm
KecepatanCukup; mode inkremental membantuSangat cepat, ditulis dalam TypeScript
Tempat alamiCI, pre-commit hook, terminalVS Code (ekstensi Pylance memakainya)
KetelitianMatang, konservatif, penuh opsiAgak 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.