← Semua pembelajaran / Python untuk AI Engineer
Fase 2 · Type Hints & Pydantic

typing — Support for type hints

Peta isi modul typing: mana yang benar-benar dipakai, mana yang sudah usang, dan mana yang bisa diabaikan.

Sumber asli docs.python.org Resmi Rangkuman ~5 menit baca

Intisari

  • Halaman referensi, bukan tutorial. Buka saat kamu butuh satu nama tertentu.
  • Sebagian besar isinya sudah usang — digantikan sintaks bawaan (list[str], str | None).
  • Yang masih aktif dipakai: Any, Literal, Final, Protocol, TypedDict, cast, Annotated.
  • Tipe koleksi abstrak sekarang diimpor dari collections.abc, bukan typing.
  • Annotated adalah dasar dari Field() Pydantic dan Depends() FastAPI.

Cara memakai halaman ini

Dokumentasi typing panjang dan berisi banyak hal historis. Jangan dibaca dari atas ke bawah. Tabel di bawah ini adalah peta: mana yang masih hidup, mana yang sudah tergantikan.

Yang masih aktif dipakai

NamaFungsinyaContoh
AnyMatikan pengecekandict[str, Any]
LiteralNilai terbatasLiteral["a", "b"]
FinalTidak boleh diubahMAX: Final = 10
ProtocolDuck typing strukturalLihat di bawah
TypedDictDict dengan bentuk tetapLihat di bawah
castPaksa mypy percayacast(Doc, x)
AnnotatedTempel metadata pada tipeDasar Pydantic & FastAPI
NamedTupleTuple bernama, punya tipeAlternatif ringan dataclass
NoReturnFungsi selalu melempar-> NoReturn
SelfKembalikan tipe class sendiriPola builder
overloadBeberapa tanda tanganJarang, tapi ada

Yang sudah tergantikan

UsangGanti denganSejak
List, Dict, Set, Tuple, Typelist, dict, set, tuple, type3.9
Optional[X]X | None3.10
Union[A, B]A | B3.10
Callable, Iterable, Sequence, Mapping, IteratorImpor dari collections.abc3.9
TypeVar eksplisitSintaks def f[T](...)3.12

Annotated — kenapa ini penting

Annotated[Tipe, metadata] menempelkan informasi tambahan ke sebuah tipe. Type checker mengabaikan metadata-nya; library yang membacanya bisa memanfaatkannya. Ini fondasi dari dua hal yang akan kamu pakai terus:

from typing import Annotated
from pydantic import Field

class Tiket(BaseModel):
    judul: Annotated[str, Field(min_length=1, max_length=200)]
    prioritas: Annotated[int, Field(ge=1, le=5)]
from fastapi import Depends

@app.post("/chat")
async def chat(
    req: ChatRequest,
    client: Annotated[AsyncAnthropic, Depends(get_client)],
) -> ChatResponse: ...

Bagi mypy, Annotated[str, Field(...)] hanyalah str. Bagi Pydantic, bagian Field(...) adalah aturan validasi. Bagi FastAPI, Depends(...) adalah instruksi dependency injection. Satu sintaks, tiga pembaca berbeda.

Protocol — cocok untuk testing

from typing import Protocol

class VectorStore(Protocol):
    def cari(self, embedding: list[float], top_k: int) -> list[str]: ...
    def simpan(self, id: str, embedding: list[float]) -> None: ...


def bangun_rag(store: VectorStore) -> None: ...

# Kedua class ini diterima, tanpa mewarisi apa pun:
class ChromaStore:
    def cari(self, embedding: list[float], top_k: int) -> list[str]: ...
    def simpan(self, id: str, embedding: list[float]) -> None: ...

class StorePalsu:      # untuk unit test
    def cari(self, embedding: list[float], top_k: int) -> list[str]:
        return ["chunk-1"]
    def simpan(self, id: str, embedding: list[float]) -> None:
        pass

TypedDict

from typing import TypedDict, NotRequired

class Pesan(TypedDict):
    role: str
    content: str
    name: NotRequired[str]        # opsional

riwayat: list[Pesan] = [
    {"role": "user", "content": "halo"},
]

Bedanya dengan Pydantic: TypedDict hanya memberi tahu mypy bentuk dict-nya. Tidak ada validasi runtime, tidak ada parsing, tidak ada JSON Schema. Pakai untuk bentuk dict yang memang harus tetap dict — misalnya array messages yang dikirim ke API LLM.

Self

from typing import Self

class Query:
    def filter(self, **kw) -> Self:
        ...
        return self

    def limit(self, n: int) -> Self:
        ...
        return self

Query().filter(x=1).limit(10)     # tipe tetap benar di subclass

Yang boleh diabaikan sepenuhnya

ParamSpec, TypeVarTuple, Concatenate, Unpack, TypeGuard, assert_type, dataclass_transform — semua ini untuk penulis library dan dekorator generik. Tidak akan kamu butuhkan di kode aplikasi.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.