Type Hints di Python
Type hints (annotation) memberi tahu tipe parameter dan return value tanpa mengubah perilaku runtime Python. Ditambahkan resmi di PEP 484.
Sintaks Dasar
def sapa(nama: str) -> str:
return f"Halo, {nama}!"
def jumlah(a: int, b: int) -> int:
return a + b
umur: int = 25
pi: float = 3.14
aktif: bool = True
: tipesetelah nama parameter/variabel-> tipesebelum:di akhir signature fungsi (return type)
Tipe Collection
Sejak Python 3.9+, tipe built-in bisa langsung di-subscript (tidak perlu from typing):
def average(angka: list[int]) -> float:
return sum(angka) / len(angka)
def count_words(text: str) -> dict[str, int]:
hasil: dict[str, int] = {}
for w in text.split():
hasil[w] = hasil.get(w, 0) + 1
return hasil
koordinat: tuple[float, float] = (10.5, 20.3)
unique_tags: set[str] = {"python", "web"}
Module typing
from typing import Optional, Union, Callable, Any
# Optional[X] = X | None — parameter boleh None
def cari_user(id: int) -> Optional[str]:
if id == 0:
return None
return "Budi"
# Union[A, B] = A atau B
def parse(x: Union[int, str]) -> int:
return int(x)
# Python 3.10+ — pakai operator | (lebih ringkas)
def parse_v2(x: int | str) -> int:
return int(x)
# Callable — tipe untuk fungsi
def apply(fn: Callable[[int], int], x: int) -> int:
return fn(x)
apply(lambda n: n * 2, 5) # 10
Kenapa Pakai Type Hints?
- Autocomplete lebih pintar — IDE tahu tipe setiap variabel dan method apa yang tersedia
- Deteksi bug lebih awal —
mypy,pyright, dan linter bisa menangkap kesalahan tipe sebelum runtime - Dokumentasi hidup — signature fungsi jadi self-explanatory
- Refactor aman — tool bisa melacak dampak perubahan signature
Runtime Behavior — TIDAK Dipaksa!
def kuadrat(x: int) -> int:
return x ** 2
# Python TIDAK melempar error walaupun tipe salah
print(kuadrat("3")) # TypeError: unsupported... (dari operasi **, bukan dari hint)
print(kuadrat(2.5)) # 6.25 — jalan, walaupun hint-nya int
Type hints hanya hint — tool statis yang memverifikasinya, bukan Python sendiri. Kalau kamu butuh enforcement runtime, pakai library seperti pydantic.
Type Alias
Beri nama pendek untuk tipe kompleks:
from typing import TypeAlias
Coords: TypeAlias = tuple[float, float]
Scores: TypeAlias = dict[str, list[int]]
def jarak(a: Coords, b: Coords) -> float:
return ((a[0]-b[0])**2 + (a[1]-b[1])**2) ** 0.5
Dataclasses (Sekilas)
Cara ringkas membuat class "data container" dengan type hints — otomatis dapat __init__, __repr__, dan __eq__.
from dataclasses import dataclass
@dataclass
class Mahasiswa:
nama: str
nim: str
ipk: float = 0.0
mhs = Mahasiswa("Budi", "123")
print(mhs) # Mahasiswa(nama='Budi', nim='123', ipk=0.0)