Notebook Python reaktif yang tepat untuk Jupyter [lab]:
pip install ipyflowPython 3 (ipyflow) dari peluncur atau pemilih kernel.IPYFLOW adalah kernel Python generasi berikutnya untuk Jupyterlab dan Notebook 7 yang melacak hubungan dataflow antara simbol dan sel selama sesi interaktif yang diberikan, sehingga membuatnya lebih mudah untuk bernalar tentang status notebook. Berikut adalah video pembicaraan Jupytercon yang memperkenalkannya (dan slide yang sesuai).
Jika Anda ingin melewatkan lift pitch dan lewati langsung ke instruksi instalasi / aktivasi melompat ke cepat mulai di bawah; Kalau tidak, teruslah membaca untuk mempelajari tentang filosofi dan set fitur IpyFlow.
IpyFlow memberikan reaktivitas baut terhadap kernel python default Jupyter, Ipykernel. Itu dirancang dengan tujuan berikut dalam pikiran:
B tergantung pada sel A karena referensi subskrip x[0] , dan cukup pintar untuk tidak secara reaktif mengeksekusi sel B ketika beberapa bagian lain dari x , misalnya x[1] , berubah. Akibatnya, ia membatasi kembali eksekusi yang tidak perlu untuk minimum.Untuk menginstal, jalankan:
pip install ipyflowUntuk menjalankan kernel ipyflow, pilih "Python 3 (IpyFlow)" dari daftar kernel yang tersedia di tab Peluncur. Demikian pula, Anda dapat beralih ke / dari ipyflow dari buku catatan yang ada dengan menavigasi ke item menu file "ubah kernel":
| Titik masuk | Switcher kernel |
|---|---|
IpyFlow mengirimkan ekstensi yang membawa reaktivitas ke Jupyterlab dan Notebook 7 secara default, mirip dengan perilaku eksekusi yang ditawarkan dalam buku catatan lain seperti Observable, Pluto.jl, dan Marimo.
Reaktivitas IpyFlow berperilaku sedikit berbeda dari yang di atas, karena, karena dirancang untuk memenuhi kebutuhan pengguna Jupyter pada khususnya. Saat Anda menjalankan Cell C dengan IpyFlow, output C , output sel C bergantung pada, dan output sel yang bergantung pada C semua muncul seperti yang mereka lakukan jika notebook dieksekusi dari atas ke bawah (misalnya melalui "Restart dan run-all"). Ketika Anda memilih beberapa sel C , semua sel yang akan mengeksekusi ulang ketika C dieksekusi memiliki titik oranye di sebelahnya, dan sel yang bergantung pada C tetapi itu terkini dan tidak akan mengeksekusi kembali memiliki titik ungu:
Informasi ketergantungan sel tetap ada pada metadata notebook, sehingga Anda dapat melompat ke sel apa pun setelah memulai sesi kernel baru, menjalankannya, dan yakin bahwa output adalah apa yang dimaksudkan oleh penulis buku catatan:
Karena ipyflow mengintip pada status runtime untuk menyimpulkan dependensi, ia perlu menjaga konten notebook dalam sinkronisasi dengan keadaan memori kernel, bahkan di seluruh browser penyegaran. Dengan demikian, IPYFLOW memungkinkan autosave-on-change secara default, sehingga keadaan kernel, notebook UI dalam keadaan dalam memori, dan file notebook pada disk semuanya selaras. Jika Anda secara tidak sengaja menimpa output sel yang ingin Anda pertahankan, misalnya selama eksekusi reaktif, dan autosave menimpa hasil sebelumnya pada disk, jangan takut! IPYFLOW menyediakan utilitas perpustakaan yang disebut reproduce_cell untuk memulihkan input dan output dari eksekusi sel sebelumnya (dalam sesi kernel yang diberikan):
from ipyflow import reproduce_cell
reproduce_cell ( 4 , lookback = 1 ) # to reproduce the previous execution of cell 4Contoh:
Jika Anda ingin memilih untuk tidak terpisah dari eksekusi reaktif, Anda dapat menggunakan Ctrl+Shift+Enter (pada Mac, CMD+Shift+Enter juga berfungsi) untuk hanya menjalankan sel yang dimaksud:
Anda juga dapat menjalankan %flow mode normal dalam memilih keluar dari mode eksekusi reaktif default (dalam hal ini, CTR+Shift+Enter / CMD+Shift+Enter akan beralih dari nonreaktif ke reaktif). Untuk reenable reaktif eksekusi sebagai default, Anda dapat menjalankan %flow mode reactive :
Jika Anda ingin mencegah perilaku reaktif default untuk setiap sesi kernel baru, Anda dapat menambahkan ini ke profil ipython Anda (lokasi default biasanya di ~/.ipython/profile_default/ipython_config.py ):
c = get_config ()
c . ipyflow . exec_mode = "normal" # defaults to "reactive" IPYFLOW default ke semantik pesanan , yang berarti bahwa, jika sel B tergantung pada sel A , maka harus muncul B A urutan spasial notebook. IpyFlow tidak mencegah sel -sel sebelumnya merujuk data yang dibuat atau diperbarui oleh sel -sel selanjutnya, tetapi itu menghilangkan tepi ini saat melakukan eksekusi reaktif.
Semantik dalam pesanan, meskipun kurang fleksibel, memiliki beberapa sifat yang diinginkan jika dibandingkan dengan semantik pemesanan apa pun, karena mereka mendorong buku catatan yang lebih bersih dan lebih dapat direproduksi yang dapat lebih mudah dikonversi menjadi skrip Python nanti. Sekarang saya mungkin atau mungkin belum menjual Anda di semantik dalam pesanan, Anda dapat mengaktifkan semantik pesanan apa pun di IpyFlow dengan menjalankan %flow direction any_order ajaib %flow direction in_order
Anda juga dapat memperbarui profil Ipython Anda jika Anda ingin menjadikan semantik pemesanan sebagai perilaku default untuk sesi kernel baru:
c = get_config ()
c . ipyflow . flow_direction = "any_order" # defaults to "in_order"Setiap kali sel merujuk data yang diperbarui, collapser di sebelahnya diberi warna oranye (mirip dengan warna untuk sel -sel kotor), dan sel yang (secara rekursif) bergantung padanya diberikan warna collapser ungu. (Input oranye dengan output ungu hanya berarti bahwa output mungkin di luar sinkronisasi.) Saat menggunakan eksekusi reaktif, Anda biasanya tidak akan melihatnya, karena sel-sel yang bergantung pada sinkronisasi akan diulang secara otomatis, meskipun Anda dapat melihatnya jika menggunakan Ctrl+Shift+untuk sementara memilih di antara reaktivitas, atau jika Anda mengubah data yang lebih tinggi (selanjutnya melampaui sel.
Jika Anda ingin membiarkan IpyFlow memperbaikinya untuk Anda, Anda dapat menekan "ruang" ketika dalam mode perintah untuk secara otomatis menyelesaikan semua sel basi atau kotor. Operasi ini dapat memperkenalkan lebih banyak sel basi, dalam hal ini Anda dapat terus menekan "ruang" sampai semua ketidakkonsistenan diselesaikan, jika diinginkan:
Sel -sel yang merujuk pada fungsi dan kelas Python, primitif seperti bilangan bulat, pelampung, string, serta array yang tidak bagus, data panda, dan wadah (daftar, dikt, set, tupel, dll. )Nya dapat dimoized oleh IpyFlow menggunakan pseudomik yang %%memoize khusus. Tidak perlu menentukan "input" ke sel, karena IpyFlow akan menyimpulkan ini secara otomatis. Sel-sel yang dimoized mensyair hasilnya dalam memori (meskipun cache yang didukung disk direncanakan untuk masa depan), dan akan mengambil hasil yang di-cache ini (daripada menjalankan kembali sel) setiap kali ipyflow mendeteksi input dan konten sel yang identik dengan menjalankan sebelumnya:
Secara default, %%memoize melewatkan semua output kecuali potensial displayhook output dari ekspresi terakhir di sel (bila berlaku). Untuk melewatkan ini juga, lulus --quiet , dan termasuk stdout, stderr, dan output kaya lainnya, lulus --verbose :
Mesin eksekusi reaktif IpyFlow memiliki dukungan bawaan untuk ipywidgets , memungkinkan perubahan widget diperbanyak di seluruh batas sel:
Fungsionalitas ini dapat dikombinasikan dengan %%memoize Magic untuk menyediakan rendering plot interaktif yang hampir real-time di seluruh sel:
Fungsionalitas ini dapat dipasangkan dengan ekstensi lain seperti Stickyland untuk membangun dasbor yang sepenuhnya reaktif di atas Jupyterlab + IpyFlow.
Akhirnya, ipyflow juga terintegrasi dengan widget merkuri juga:
IpyFlow harus memahami keadaan eksekusi yang mendasarinya pada tingkat yang dalam untuk memberikan fitur -fiturnya. Ini memperlihatkan API untuk berinteraksi dengan beberapa keadaan ini, termasuk fungsi code untuk mendapatkan kode yang diperlukan untuk merekonstruksi beberapa simbol:
# Cell 1
from ipyflow import code
# Cell 2
x = 0
# Cell 3
y = x + 1
# Cell 4
print ( code ( y ))
# Output:
"""
# Cell 2
x = 0
# Cell 3
y = x + 1
""" Anda juga dapat melakukan ini di tingkat sel juga menggunakan metode slice() :
from ipyflow import cells
print ( cells ( 4 ). slice ())
# Output:
"""
# Cell 2
x = 0
# Cell 3
y = x + 1
# Cell 4
print(code(y))
""" Anda juga dapat melihat sel (1-indeks) dan pernyataan (0-indeks) saat simbol terakhir diperbarui dengan fungsi timestamp :
from ipyflow import timestamp
timestamp ( y )
# Timestamp(cell_num=3, stmt_num=0) Untuk melihat ketergantungan dan tanggungan dari simbol tertentu, masing -masing menggunakan ffuctions deps dan users :
from ipyflow import deps , users
deps ( y )
# [<x>]
users ( x )
# [<y>] Jika Anda ingin meningkatkan simbol ke representasi yang digunakan secara internal oleh IpyFlow, gunakan fungsi lift (dengan risiko Anda sendiri, tentu saja):
from ipyflow import lift
y_sym = lift ( y )
y_sym . timestamp
# Timestamp(cell_num=3, stmt_num=0) Reaktivitas dan fitur frontend lainnya belum berfungsi di antarmuka seperti COLAB atau VSCODE, tetapi Anda masih dapat menggunakan API IpyFlow's Dataflow pada permukaan ini dengan menginisialisasi sesi notebook Anda dengan kode berikut:
%pip install ipyflow
%load_ext ipyflow
Ipyflow memulai hidupnya dengan nama NBSafety, yang memberikan saran awal dan mengiris fungsionalitas.
Untuk saran eksekusi:
@article { macke2021fine ,
title = { Fine-grained lineage for safer notebook interactions } ,
author = { Macke, Stephen and Gong, Hongpu and Lee, Doris Jung-Lin and Head, Andrew and Xin, Doris and Parameswaran, Aditya } ,
journal = { Proceedings of the VLDB Endowment } ,
volume = { 14 } ,
number = { 6 } ,
pages = { 1093--1101 } ,
year = { 2021 } ,
publisher = { VLDB Endowment }
} Untuk pengiris dinamis (digunakan untuk reaktivitas dan untuk fungsi code , misalnya):
@article { shankar2022bolt ,
title = { Bolt-on, Compact, and Rapid Program Slicing for Notebooks } ,
author = { Shankar, Shreya and Macke, Stephen and Chasins, Andrew and Head, Andrew and Parameswaran, Aditya } ,
journal = { Proceedings of the VLDB Endowment } ,
volume = { 15 } ,
number = { 13 } ,
pages = { 4038--4047 } ,
year = { 2022 } ,
publisher = { VLDB Endowment }
}Untuk apa pun yang tidak tercakup dalam makalah di atas, Anda dapat mengutip repo ipyflow:
@misc { ipyflow ,
title = { {IPyflow: A Next-Generation, Dataflow-Aware IPython Kernel} } ,
howpublished = { url{https://github.com/ipyflow/ipyflow} } ,
year = { 2022 } ,
}IPYFLOW tidak akan mungkin terjadi tanpa kolaborator akademik yang luar biasa yang terdaftar pada makalah di atas. Fitur eksekusi reaktifnya terinspirasi oleh alat -alat luar biasa lainnya seperti Hex Notebooks, Pluto.jl, dan Observable. Ipyflow juga menikmati penyerbukan silang ide dengan notebook Python reaktif lainnya seperti Marimo, jolin.io, dan Datalore --- pasti memeriksanya juga jika Anda menyukai IpyFlow.
Pekerjaan di IpyFlow telah mendapat manfaat dari dukungan orang -orang dari sejumlah perusahaan - keduanya dalam bentuk kontribusi keuangan langsung (databricks, hex) maupun dukungan moral dan dorongan moral tidak langsung (Ponder, Meta). Dan tentu saja, IpyFlow bertumpu pada fondasi yang dibangun oleh komunitas Jupyter yang luar biasa.
Kode dalam proyek ini dilisensikan di bawah lisensi BSD-3-Clause.