PEP 8 — Style Guide
Dari seluruh PEP 8, yang perlu kamu hafal hanya konvensi penamaan. Tata letak diurus formatter.
Intisari
- Bagian yang benar-benar perlu dihafal: konvensi penamaan. Sisanya otomatis.
snake_caseuntuk fungsi dan variabel,PascalCaseuntuk class,SCREAMING_CASEuntuk konstanta.- Satu underscore di depan (
_internal) artinya “ini urusan dalam” — konvensi, bukan paksaan bahasa. - Bandingkan dengan
Nonepakaiis, bukan==. - PEP 8 sendiri bilang: konsistensi dengan kode sekitar lebih penting daripada mematuhi aturan.
Penamaan — hafalkan tabel ini
| Untuk | Gaya | Contoh |
|---|---|---|
| Modul / file | lowercase pendek | llm.py, retrieval.py |
| Package / folder | lowercase, tanpa underscore kalau bisa | myapp |
| Class | PascalCase | DokumenChunk, RetrievalError |
| Fungsi / method | snake_case | cari_dokumen() |
| Variabel | snake_case | total_token |
| Konstanta | SCREAMING_SNAKE_CASE | MAX_TOKENS = 4096 |
| Internal (non-publik) | Awali _ | _hitung_skor() |
| Menghindari kata kunci | Akhiri _ | class_, id_ |
| Tidak dipakai | _ | for _ in range(3) |
Underscore di depan tidak memaksa apa pun. Python tidak punya private.
_nama adalah pesan ke sesama programmer: "ini detail internal, aku boleh
mengubahnya kapan saja tanpa memberitahu." Kalau kamu mengakses _nama milik
library lain, itu tanggung jawabmu sendiri saat library-nya update.
Urutan import
import json # 1. standard library
import os
from pathlib import Path
import httpx # 2. pihak ketiga
from pydantic import BaseModel
from myapp.models import Dokumen # 3. kode sendiri
from myapp.settings import config
Tiga blok, dipisah baris kosong, masing-masing terurut alfabet. Ini ditegakkan otomatis
oleh aturan I di Ruff — kamu tidak perlu mengurutkannya sendiri.
Perbandingan
if x is None: ... # ✅ untuk None gunakan is
if x == None: ... # ❌
if not items: ... # ✅ list/dict/str kosong itu falsy
if len(items) == 0: ... # ❌ bertele-tele
if isinstance(x, Dokumen): ... # ✅ cek tipe
if type(x) == Dokumen: ... # ❌ gagal untuk subclass
if selesai: ... # ✅
if selesai == True: ... # ❌
Nilai apa saja yang falsy
False, None, 0, 0.0, "", [], {}, set(), ()
Hati-hati: if jumlah: akan bernilai salah kalau jumlah adalah
0 — padahal 0 mungkin nilai yang sah. Kalau yang kamu maksud adalah "belum diisi",
tulis if jumlah is None:.
Tata letak — Ruff yang mengurus
Kamu tidak perlu menghafal ini; formatter menerapkannya saat kamu simpan file:
- Indentasi 4 spasi, bukan tab
- Dua baris kosong antar definisi top-level, satu baris kosong antar method di dalam class
- Spasi di sekitar operator:
x = a + b, bukanx=a+b - Tidak ada spasi di dalam kurung:
f(a, b), bukanf( a, b ) - Panjang baris — PEP 8 bilang 79, praktik modern 88–100. Atur di
pyproject.toml.
Docstring
def cari(query: str, top_k: int = 5) -> list[Dokumen]:
"""Cari dokumen paling relevan dengan query.
Args:
query: Teks pencarian dari pengguna.
top_k: Jumlah dokumen yang dikembalikan.
Returns:
Daftar dokumen terurut dari skor tertinggi.
Raises:
RetrievalError: Kalau vector store tidak bisa dihubungi.
"""
Docstring bukan sekadar dokumentasi di Fase 4. SDK Anthropic membaca docstring dan type hint fungsimu untuk membentuk skema tool yang dikirim ke LLM. Deskripsi yang jelas di sini langsung memengaruhi seberapa tepat model memanggil fungsimu.
Bagian PEP 8 yang boleh dilewati
- Detail lanjutan soal indentasi lanjutan baris — formatter yang urus
- Aturan spasi yang sangat rinci — formatter juga
- Bagian anotasi tipe — sudah usang, lihat materi Fase 2
Kalimat penutup PEP 8 sendiri
“A Foolish Consistency is the Hobgoblin of Little Minds” — konsistensi dengan kode di sekitarnya lebih penting daripada mematuhi PEP 8 secara buta. Kalau kamu bergabung ke proyek yang punya gaya berbeda, ikuti gaya proyek itu.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.