← Semua pembelajaran / Python untuk AI Engineer
Fase 0 · Setup Toolchain

Ruff — Linter & Formatter

Ruff menggabungkan linter dan formatter Python jadi satu tool yang sangat cepat. Ini konfigurasi minimal yang perlu kamu tahu.

Intisari

  • Dua peran berbeda dalam satu tool: ruff format (merapikan) dan ruff check (menemukan masalah).
  • Menggantikan black + flake8 + isort + pyupgrade + autoflake sekaligus.
  • Aturan dipilih lewat kode huruf: E/F dasar, I urutan import, UP modernisasi sintaks, B jebakan umum.
  • --fix memperbaiki otomatis sebagian besar temuan. Aman dipakai rutin.
  • Aktifkan format-on-save di editor sejak hari pertama — supaya kamu tidak pernah memikirkan format lagi.

Dua peran yang harus kamu bedakan

ruff formatruff check
Menggantikanblackflake8, isort, pyupgrade
MengurusTata letak: indentasi, kutip, panjang barisKebenaran: variabel tak terpakai, import mati, bug kecil
Bisa salah?Tidak — perubahan tidak mengubah arti kodeKadang: sebagian aturan bersifat opini
Kapan jalanSetiap kali saveSebelum commit & di CI

Pemakaian dasar

uvx ruff format .            # rapikan semua file
uvx ruff format --check .    # cek saja, jangan ubah (untuk CI)

uvx ruff check .             # cari masalah
uvx ruff check --fix .       # cari + perbaiki yang bisa diperbaiki otomatis
uvx ruff check --watch .     # jalan terus, cek tiap file berubah

Konfigurasi di pyproject.toml

Ruff punya default yang masuk akal. Kamu hanya perlu menambahkan ini:

[tool.ruff]
line-length = 100
target-version = "py313"

[tool.ruff.lint]
select = [
    "E",    # pycodestyle — error gaya penulisan
    "F",    # pyflakes — variabel/import tak terpakai, nama tak dikenal
    "I",    # isort — urutan import
    "UP",   # pyupgrade — modernisasi sintaks lama
    "B",    # flake8-bugbear — jebakan yang sering jadi bug
    "SIM",  # flake8-simplify — kode yang bisa lebih sederhana
]
ignore = [
    "E501",  # panjang baris — sudah diurus formatter
]

[tool.ruff.lint.per-file-ignores]
"tests/*" = ["S101"]   # assert boleh di file test

Kode aturan yang layak diaktifkan

KodeIsinyaContoh temuan
FKesalahan nyataImport tak terpakai, variabel tak didefinisikan
EGaya PEP 8Spasi ganda, baris terlalu panjang
IUrutan importstdlib → third-party → lokal, otomatis dirapikan
UPModernisasiList[str] → list[str], % → f-string
BJebakan umumMutable default argument, except terlalu luas
SIMPenyederhanaanif x == True → if x
ASYNCKesalahan asyncPanggilan blocking di dalam async def

UP adalah pilihan bernilai tinggi untuk pendatang baru. Karena kamu belajar dari banyak sumber yang usianya berbeda-beda, kamu pasti akan menulis idiom lama tanpa sadar. Aturan UP menangkapnya dan --fix langsung memodernkannya — semacam guru gaya penulisan yang otomatis.

Mematikan aturan pada baris tertentu

import os  # noqa: F401  — sengaja diimpor untuk side effect

# noqa polos (tanpa kode) sebaiknya dihindari:
# ia mematikan SEMUA aturan di baris itu, termasuk yang belum ada.
x = eval(data)  # noqa: S307

Integrasi editor

VS Code: pasang extension Ruff (astral-sh.ruff), lalu di settings.json:

{
  "[python]": {
    "editor.defaultFormatter": "charliermarsh.ruff",
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.fixAll.ruff": "explicit",
      "source.organizeImports.ruff": "explicit"
    }
  }
}

Setelah ini, setiap kali kamu tekan simpan: kode dirapikan, import diurutkan, masalah kecil diperbaiki.

Menjalankan di CI

uvx ruff format --check .   # gagal kalau ada file yang belum rapi
uvx ruff check .            # gagal kalau ada temuan lint

Kalau kamu mengambil alih proyek lama

Menyalakan Ruff pada codebase lama bisa memunculkan ratusan temuan sekaligus. Cara halusnya:

uvx ruff check --statistics .     # lihat sebarannya dulu
uvx ruff check --add-noqa .       # bubuhkan noqa di semua temuan yang ada

Perintah kedua "membekukan" utang teknis yang ada, sehingga kode baru tetap bersih. Lalu kamu bisa mencicil menghapus noqa itu seiring waktu.

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