Dinamisnya Python membuat harga * nama bisa lolos ditulis — sampai program berjalan dan TypeError muncul di hadapan pengguna. Definition function juga tidak menunjukkan nilai apa yang harus dikirim: string? angka? list berisi apa? Type hints mengisi kekosongan ini dengan anotasi tipe yang terbaca langsung dari signature. Perlu dipahami sejak awal: anotasi ini tidak mengubah cara program berjalan. Manfaat sebenarnya ada pada dokumentasi dan dukungan alat bantu — dan itulah topik penutup Section ini.
Sintaks Dasar Anotasi #
Anotasi ditulis dengan tanda titik dua setelah nama parameter, dan tanda panah -> sebelum titik dua penutup untuk tipe nilai balik:
def sapa(nama: str) -> str:
return f"Halo, {nama}!"
print(sapa("Budi"))
print(sapa("Siti"))Output yang Dihasilkan:
Halo, Budi!
Halo, Siti!Mari kita telaah baris-barisnya:
nama: str: parameternamadianotasi bertipestr— maksudnya, pemanggil seharusnya mengirim string.-> str: nilai balik function dianotasi bertipestr.- Baris 4-5: keluaran program sama sekali tidak berubah. Eksekusi berjalan seperti anotasi tidak pernah ditulis.
Anotasi mengikuti gaya penulisan yang sudah kita kenal dari Chapter Mendefinisikan Fungsi — hanya dua tempat yang bertambah: setelah nama parameter dan sebelum titik dua akhir.
Tidak Diperiksa Saat Runtime #
Fakta paling penting: interpreter Python menyimpan anotasi lalu mengabaikannya saat eksekusi. Mengirim angka ke parameter beranotasi str tetap berjalan bila operasinya tidak error:
def sapa(nama: str) -> str:
return f"Halo, {nama}!"
print(sapa(42))Output yang Dihasilkan:
Halo, 42!Tidak ada peringatan, tidak ada galat — f-string menerima angka 42 sebagaimana menerima string. Anotasi bukan validasi input; anotasi adalah kontrak tertulis untuk manusia dan alat bantu. Interpreter Python hanya mencatatnya di atribut __annotations__ milik function:
def hitung_luas(panjang: float, lebar: float) -> float:
return panjang * lebar
print(hitung_luas(6.5, 4))
print(hitung_luas.__annotations__)Output yang Dihasilkan:
26.0
{'panjang': <class 'float'>, 'lebar': <class 'float'>, 'return': <class 'float'>}Atribut __annotations__ berupa dictionary: key adalah nama parameter (plus 'return' untuk nilai balik), value adalah tipe yang kita tulis. Inilah seluruh yang dilakukan interpreter — sisa kekuatan type hints berada di luar runtime.
Anotasi dengan Nilai Bawaan #
Parameter dengan default menempatkan anotasi sebelum tanda sama dengan: maksimum: int = 3. Tipe bawaan generik seperti list[str] (list berisi string, tersedia sejak Python 3.9) juga sah dipakai:
def ringkas(items: list[str], maksimum: int = 3) -> str:
return ", ".join(items[:maksimum])
print(ringkas(["kopi", "teh", "susu", "roti"]))
print(ringkas(["kopi", "teh", "susu", "roti"], maksimum=2))Output yang Dihasilkan:
kopi, teh, susu
kopi, tehPembacaan signature kini padat makna: ringkas menerima list of string, secara opsional batas jumlah integer bernilai bawaan 3, dan mengembalikan string. Dokumentasi semacam ini selalu sinkron dengan kode karena keduanya berada pada baris yang sama.
Manfaat Nyata #
Jika runtime mengabaikan anotasi, untuk apa menuliskannya? Tiga manfaat utamanya:
- Dokumentasi yang tidak boleh kedaluwarsa — signature menjadi menjelaskan diri; pembaca tahu harus mengirim apa tanpa membuka badan function.
- Bantuan editor — code editor modern membaca anotasi lalu memberi pelengkapan otomatis dan peringatan saat kita mengirim tipe yang jauh berbeda, sebelum program dijalankan.
- Pemeriksaan statis — alat seperti mypy atau Pyright memeriksa seluruh file tanpa menjalankan program; untuk kasus
sapa(42)di atas, alat tersebut akan menunjuk baris itu dan melaporkan bahwa argument pertamasapabertipeintpadahal dideklarasikanstr.
Sistem tipe Python lengkap — Optional, Union, alias, hingga generics — adalah dunia tersendiri. Dasar yang kita kuasai di chapter ini akan dipakai terus; pembahasan penuhnya menanti pada Chapter Pengenalan Type Hints di Section Type Hints dan Static Analysis.