Input and Output — Fancier Output Formatting
f-string adalah cara memformat teks di Python modern. Ini spesifikasi formatnya yang benar-benar dipakai.
Intisari
- f-string (
f"...") menggantikan%dan.format(). Pakai itu saja. - Format spec setelah titik dua:
f"{nilai:<spec>}"— mengatur lebar, presisi, dan pemisah ribuan. f"{x=}"mencetakx=42— trik debug tercepat yang ada.- Ubah cara tampil dengan
!r(repr) — penting saat mencatat string ke log. - Untuk
logging, jangan pakai f-string. Pakai%s+ argumen.
Tiga cara memformat — pakai yang pertama
nama, umur = "Budi", 30
f"Halo {nama}, umur {umur}" # ✅ f-string, Python 3.6+
"Halo {}, umur {}".format(nama, umur) # cara lama
"Halo %s, umur %d" % (nama, umur) # cara paling lama
Format spec
Semua pengaturan ditulis setelah titik dua di dalam kurung kurawal:
{nilai:[isi][rata][tanda][#][0][lebar][,][.presisi][tipe]}
Angka
harga = 1234567.891
f"{harga:.2f}" # '1234567.89' dua desimal
f"{harga:,.2f}" # '1,234,567.89' pemisah ribuan
f"{harga:_.2f}" # '1_234_567.89' pemisah underscore
f"{harga:.0f}" # '1234568' dibulatkan
f"{harga:e}" # '1.234568e+06' notasi ilmiah
f"{0.8734:.1%}" # '87.3%' persentase
f"{255:b}" # '11111111' biner
f"{255:x}" # 'ff' heksadesimal
f"{42:+d}" # '+42' selalu tampilkan tanda
Perataan dan lebar
f"{'kiri':<10}|" # 'kiri |'
f"{'kanan':>10}|" # ' kanan|'
f"{'tengah':^10}|" # ' tengah |'
f"{'isi':*^10}|" # '***isi****|' karakter pengisi
f"{7:03d}" # '007' padding nol
Sangat berguna untuk membuat tabel di terminal:
for m in model:
print(f"{m.nama:<24} {m.input_token:>10,} {m.biaya:>9.4f}")
Tanggal
from datetime import datetime
now = datetime.now()
f"{now:%Y-%m-%d}" # '2026-08-07'
f"{now:%d %B %Y}" # '07 August 2026'
f"{now:%H:%M:%S}" # '14:32:07'
f"{now:%Y-%m-%dT%H:%M:%SZ}" # format ISO-8601
Trik debug =
nilai = 42
skor = 0.87654
f"{nilai=}" # 'nilai=42'
f"{skor=:.2f}" # 'skor=0.88'
f"{len(items)=}" # 'len(items)=17' ← ekspresi apa pun boleh
Ini menggantikan print("nilai:", nilai) selamanya. Kamu tidak perlu lagi
mengetik nama variabel dua kali, dan tidak ada risiko labelnya jadi salah setelah rename.
Pakai ini untuk debugging cepat — untuk aplikasi sungguhan, pakai logging.
!r — tampilkan bentuk repr
teks = "halo "
f"nilai: {teks}" # 'nilai: halo ' ← spasi di akhir tak terlihat
f"nilai: {teks!r}" # "nilai: 'halo '" ← jelas ada spasinya
Aturan praktis: pakai !r setiap kali kamu mencatat string ke log. Ia menampilkan tanda
kutip dan meng-escape karakter tersembunyi, sehingga masalah seperti spasi berlebih, newline, atau
string kosong langsung kelihatan.
f-string multibaris
prompt = f"""Kamu adalah asisten.
Konteks:
{konteks}
Pertanyaan: {pertanyaan}
"""
Pola ini akan sering kamu pakai untuk menyusun prompt LLM di Fase 4 dan 7.
Kurung kurawal literal
f"{{ini kurung literal}}" # '{ini kurung literal}'
# Penting saat membuat contoh JSON di dalam prompt:
f'Balas dengan JSON: {{"nama": "...", "skor": {ambang}}}'
Satu pengecualian penting: logging
import logging
logger = logging.getLogger(__name__)
logger.info(f"memproses {len(docs)} dokumen") # ❌
logger.info("memproses %s dokumen", len(docs)) # ✅
Kenapa: f-string dievaluasi sebelum fungsi dipanggil. Kalau level log-mu
WARNING, string itu tetap dirakit lalu dibuang — pemborosan yang nyata di loop panas.
Bentuk %s menunda perakitan sampai pesannya benar-benar akan ditulis. Ruff aturan
G menangkap ini.
Menulis dan membaca file (ringkas)
from pathlib import Path
Path("out.txt").write_text(isi, encoding="utf-8")
isi = Path("in.txt").read_text(encoding="utf-8")
import json
Path("data.json").write_text(
json.dumps(data, indent=2, ensure_ascii=False, sort_keys=True),
encoding="utf-8",
)
Ingat sort_keys=True untuk Fase 4. Prompt caching pada LLM bekerja dengan
mencocokkan awalan prompt byte per byte. JSON dengan urutan key yang berubah-ubah akan
membatalkan cache secara diam-diam — dan itu berarti tagihan yang lebih mahal tanpa kamu sadari.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.