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:

python
def sapa(nama: str) -> str:
    return f"Halo, {nama}!"

print(sapa("Budi"))
print(sapa("Siti"))

Output yang Dihasilkan:

text
Halo, Budi!
Halo, Siti!

Mari kita telaah baris-barisnya:

  1. nama: str: parameter nama dianotasi bertipe str — maksudnya, pemanggil seharusnya mengirim string.
  2. -> str: nilai balik function dianotasi bertipe str.
  3. 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:

python
def sapa(nama: str) -> str:
    return f"Halo, {nama}!"

print(sapa(42))

Output yang Dihasilkan:

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

python
def hitung_luas(panjang: float, lebar: float) -> float:
    return panjang * lebar

print(hitung_luas(6.5, 4))
print(hitung_luas.__annotations__)

Output yang Dihasilkan:

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

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

text
kopi, teh, susu
kopi, teh

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

  1. Dokumentasi yang tidak boleh kedaluwarsa — signature menjadi menjelaskan diri; pembaca tahu harus mengirim apa tanpa membuka badan function.
  2. Bantuan editor — code editor modern membaca anotasi lalu memberi pelengkapan otomatis dan peringatan saat kita mengirim tipe yang jauh berbeda, sebelum program dijalankan.
  3. 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 pertama sapa bertipe int padahal dideklarasikan str.

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.