Marimo: Notebook Python yang Reaktif dan Reproducible
Marimo adalah notebook Python yang menyimpan isinya sebagai berkas .py biasa dan menjalankan sel secara reaktif, mirip cara spreadsheet menghitung ulang rumus yang saling bergantung. Marimo dirancang untuk mengatasi masalah yang sering muncul pada alur kerja notebook tradisional, terutama hidden state dan eksekusi yang tidak berurutan. Tutorial ini menjelaskan apa itu Marimo, mengapa modelnya berbeda dari Jupyter, dan cara membangun notebook eksplorasi data interaktif yang juga bisa dijalankan sebagai skrip maupun sebagai aplikasi web.
Mengapa Perlu Notebook Lain?
Notebook populer untuk eksplorasi, pengajaran, dan pelaporan. Namun notebook juga terkenal dengan satu kelas bug tertentu yang berasal dari cara kerja model notebook klasik. Sebelum melihat fitur Marimo, ada baiknya kita namai dulu masalah yang ingin diselesaikannya.
Hidden State
Pada sesi Jupyter pada umumnya, kernel menyimpan setiap variabel yang pernah Anda definisikan, bahkan setelah sel yang membuatnya dihapus. Sebuah notebook bisa tampak berfungsi hanya karena sel yang kini sudah dihapus pernah dijalankan. Buka kembali nanti, jalankan dari atas ke bawah, dan notebook itu gagal. Kode yang terlihat tidak lagi cocok dengan keadaan runtime.
Eksekusi Tidak Berurutan
Jupyter mengizinkan Anda menjalankan sel dalam urutan apa pun. Penghitung In [n] mencatat urutan yang kebetulan Anda pakai, bukan urutan yang reproducible. Dua orang yang menjalankan notebook yang sama bisa memperoleh hasil berbeda tergantung sel mana yang mereka jalankan dan kapan.
Diff dan Version Control yang Buruk
Berkas .ipynb adalah JSON yang menyatukan kode sumber, penghitung eksekusi, dan output ter-encode base64 (gambar, tabel) dalam satu dokumen. Perubahan kode satu baris saja bisa menghasilkan diff yang besar dan berisik. Meninjau pull request notebook menjadi merepotkan, dan konflik merge sering terjadi.
Sulit Digunakan Ulang
Mengubah notebook menjadi skrip atau modul biasanya berarti menyalin sel ke berkas .py dan merapikan urutan eksekusi secara manual. Notebook itu sendiri tidak bisa langsung diimpor atau dijalankan sebagai program.
Marimo mengambil sikap berbeda pada setiap poin ini. Bagian berikut menjelaskan caranya.
Instalasi dan Langkah Awal
Marimo adalah paket Python standar.
pip install marimo
Pastikan instalasi dan periksa versinya:
marimo --version
Buat notebook baru:
marimo new
Buka notebook yang sudah ada di editor:
marimo edit notebook.py
Editor berjalan di browser, tetapi berkas notebook tersimpan di disk sebagai Python biasa. Jika Anda sudah punya notebook Jupyter, konversikan:
marimo convert oldanalysis.ipynb > newanalysis.py
Untuk menyajikan notebook sebagai aplikasi interaktif yang hanya bisa dibaca, bukan dokumen yang bisa diedit:
marimo run notebook.py
Dalam mode run, sel kode disembunyikan dan hanya UI serta output yang ditampilkan. Berkas yang sama adalah dokumen editor, aplikasi, sekaligus skrip. Tidak ada langkah ekspor terpisah untuk mendapatkan program yang berfungsi.
Format Berkas .py
Notebook Marimo adalah berkas Python biasa. Setiap sel adalah fungsi yang didekorasi dengan @app.cell, dan berkas diakhiri dengan blok runner kecil. Notebook minimal terlihat seperti ini:
import marimo
app = marimo.App()
@app.cell
def ():
import marimo as mo
return (mo,)
@app.cell
def (mo):
x = 21
mo.md(f"x is {x}")
return (x,)
if name == "main":
app.run()
Ada dua hal yang patut diperhatikan. Pertama, ini adalah Python valid yang bisa Anda lint, format dengan alat seperti Black atau Ruff, dan tinjau dalam diff biasa. Perubahan kode tampil sebagai perubahan kode, bukan sebagai gumpalan JSON. Kedua, argumen fungsi dan nilai kembalian bukan boilerplate yang Anda rawat manual. Marimo menghasilkannya dari variabel yang dibaca dan didefinisikan setiap sel. Deklarasi itulah yang menggerakkan model reaktif.
Model Eksekusi Reaktif
Inilah gagasan inti Marimo dan pembeda paling jelas dari Jupyter.