Präzise reaktive Python -Notizbücher für Jupyter [Lab]:
pip install ipyflowPython 3 (ipyflow) aus dem Launcher- oder Kernel -Selektor.IpyFlow ist ein Python-Kernel der nächsten Generation für JupyterLab und Notebook 7, in dem die Datenflow-Beziehungen zwischen Symbolen und Zellen während einer bestimmten interaktiven Sitzung verfolgt werden und so den Notizbuchstatus einfacher zu begründen. Hier ist ein Video des Jupytercon -Talks, in dem er (und entsprechende Folien) eingeführt werden.
Wenn Sie den Aufzugsaufzug überspringen und direkt zu Installations- / Aktivierungsanweisungen überspringen möchten, springen Sie zum schnellen Start unten. Ansonsten lesen Sie weiter, um etwas über die Philosophie und das Feature -Set von Ipyflow zu erfahren.
IpyFlow bietet eine Reaktivität von Jupyters Standard-Python-Kernel Ipykernel. Es wurde mit den folgenden Zielen konzipiert:
B von Zelle A aufgrund einer Abschlussreferenz x[0] abhängt, und ist intelligent genug, um Zelle B nicht reaktiv auszuführen, wenn sich ein anderer Teil von x , z. x[1] , ändert. Infolgedessen beschränkt es die unnötige Wiederaussetzung auf ein Minimum.Zu installieren, ausführen:
pip install ipyflowUm einen Ipyflow -Kernel auszuführen, wählen Sie "Python 3 (ipyflow)" aus der Liste der verfügbaren Kernel auf der Registerkarte Launcher. In ähnlicher Weise können Sie von einem vorhandenen Notizbuch zu / von IPyFlow wechseln, indem Sie zum Menüpunkt "Kernel" -Datei zu navigieren:
| Einstiegspunkt | Kernel -Switcher |
|---|---|
Ipyflow wird mit Erweiterungen ausgeliefert, die standardmäßig Reaktivität auf JupyterLab und Notebook 7 bringen, ähnlich wie das Ausführungsverhalten, das in anderen Notizbüchern wie Observable, Pluto.jl und Marimo angeboten wird.
Die Reaktivität von Ipyflow verhält sich jedoch etwas anders als die oben genannten, da sie insbesondere die Anforderungen von Jupyter -Benutzern entspricht. Wenn Sie Zelle C mit ipyflow ausführen, ist C Ausgang, die Ausgabe der Zellen C abhängig von der Ausgabe der Zellen, die von C abhängen, so wie sie es tun würden, wenn das Notizbuch von oben nach unten ausgeführt würde (z. B. über "Neustart und Run-All"). Wenn Sie einige Zellen C auswählen, haben alle Zellen, die bei Ausführung C wieder ausgeführt werden, einen orangefarbenen Punkt neben ihnen, und Zellen, von denen C abhängt, die jedoch auf dem neuesten Stand sind und nicht erneut ausgesetzt sind, haben lila Punkte:
Die Zellabhängigkeitsinformationen werden in die Notebook -Metadaten bestehen, sodass Sie nach dem Start einer frischen Kernel -Sitzung zu jeder Zelle springen können, und zuversichtlich, dass die Ausgabe vom Notebook -Autor beabsichtigt wurde:
Da Ipyflow in Laufzeitzustand schaut, um Abhängigkeiten zu schließen, muss es auch in den Browser -Aktualisierungen synchronisiert werden, um den Inhalt des Notebooks mit dem Speicherzustand des Kernels synchron zu halten. Als solches ermöglicht IpyFlow standardmäßig Autosave-on-Change, so dass der Kernel-Status, der In-Memory-Status des Notebook-UI und die Notebook-Datei auf der Festplatte synchronisiert sind. Wenn Sie versehentlich die Ausgabe einer Zelle überschreiben, die Sie behalten wollten, z. B. während einer reaktiven Ausführung, überschreiben Sie das vorherige Ergebnis auf der Festplatte, fürchten Sie sich nicht! IpyFlow bietet ein Bibliotheksdienstprogramm namens reproduce_cell , um die Eingabe und Ausgabe früherer Zellausführungen wiederherzustellen (innerhalb einer bestimmten Kernel -Sitzung):
from ipyflow import reproduce_cell
reproduce_cell ( 4 , lookback = 1 ) # to reproduce the previous execution of cell 4Beispiel:
Wenn Sie die reaktive Ausführung vorübergehend abschließen möchten, können Sie Strg+Shift+Eingabetaste (auf Mac, CMD+Shift+ENTER) verwenden, um nur die betreffende Zelle auszuführen:
Sie können den Magic Command %flow mode normal auch in OPT aus dem reaktiven Ausführungsmodus für reaktive Standards ausführen. Um die reaktive reaktive Ausführung als Standardeinstellung zu veranlassen, können Sie %flow mode reactive ausführen:
Wenn Sie das standardmäßige reaktive Verhalten für jede neue Kernel -Sitzung verhindern möchten, können Sie dies Ihrem IPython -Profil hinzufügen (Standardspeicherort in der Regel unter ~/.ipython/profile_default/ipython_config.py ):
c = get_config ()
c . ipyflow . exec_mode = "normal" # defaults to "reactive" Ipyflow stand in der Semantik in Ordnung , was bedeutet, dass, wenn Zelle B von Zelle A abhängt, in der räumlichen Reihenfolge des Notizbuchs B A . IpyFlow hindert frühere Zellen nicht daran, Daten zu verweisen, die von späteren Zellen erstellt oder aktualisiert wurden, aber es lässt diese Kanten bei der Durchführung einer reaktiven Ausführung aus.
In Ordnungssemantik haben zwar weniger flexibel, haben im Vergleich zu einer Semantik jeder Ordnung einige wünschenswerte Eigenschaften, da sie sauberere und reproduzierbarere Notizbücher fördern, die später leichter in Python-Skripte umgewandelt werden können. Jetzt, da ich Sie möglicherweise in der In-Ordnung-Semantik verkauft habe oder nicht, können Sie jede Semantik in Ipyflow aktivieren, indem Sie den Magic Command %flow direction any_order ausführen und die Standard-In-Ordnung-Semantik mit %flow direction in_order erneut vermitteln:
Sie können Ihr Ipython-Profil auch aktualisieren, wenn Sie eine Semantik für jede Bestellung zum Standardverhalten für neue Kernel-Sitzungen machen möchten:
c = get_config ()
c . ipyflow . flow_direction = "any_order" # defaults to "in_order"Immer wenn eine Zelle auf Daten aktualisiert wird, erhält der Kollapser daneben eine orangefarbene Farbe (ähnlich wie die Farbe für schmutzige Zellen), und Zellen, die (rekursiv) davon abhängen, erhalten eine lila Collapserfarbe. (Ein orangefarbener Eingang mit einer lila Ausgabe bedeutet nur, dass die Ausgabe möglicherweise nicht synchronisiert ist.) Bei der Verwendung reaktiver Ausführung werden Sie diese normalerweise nicht sehen, da nicht sync-abhängige Zellen automatisch wiederholt werden, obwohl Sie sie sehen können, wenn Sie sie verwenden können, wenn Sie die Zellaktualisierung vorübergehend ändern.
Wenn Sie Ipyflow diese für Sie reparieren lassen möchten, können Sie im Befehlsmodus "Space" drücken, um alle abgestandenen oder schmutzigen Zellen automatisch aufzulösen. Diese Operation kann mehr veraltete Zellen einführen. In diesem Fall können Sie weiterhin den "Raum" drücken, bis alle Inkonsistenzen aufgelöst werden, falls gewünscht:
Zellen, die auf Python -Funktionen und Klassen, Primitive wie Ganzzahlen, Schwimmer, Zeichenfolgen, Numpy -Arrays, Pandas -Datenrahmen und Container (Listen, Diktate, Sätze, Tupel usw.) verweisen, können von Ipyflow unter Verwendung des speziellen %%memoize pseudomagic durch IPYFLOW ausgeliefert werden. Es ist nicht erforderlich, die "Eingänge" in die Zelle anzugeben, da Ipyflow diese automatisch schließt. Memoisierte Zellen zwischengespürt ihre Ergebnisse in Memory (obwohl für die Zukunft geplant sind mit Diskussionen geplant) und werden diese zwischengespeicherten Ergebnisse (anstatt die Zelle erneut zu veranlassen), wenn Ipyflow Inputs und Zellinhalte feststellt, die mit dem eines vorherigen Laufs identisch sind:
Standardmäßig überspringt %%memoize alle Ausgaben außer dem potenziellen DisplayHook -Ausgang aus der letzten Expression in der Zelle (falls zutreffend). Um dies auch zu überspringen, passieren --quiet , und um Stdout, Stderr und andere reichhaltige Ausgaben, Pass --verbose :
Die Reactive Execution Engine von Ipyflow bietet integrierte Unterstützung für ipywidgets , sodass Widget-Änderungen über Zellgrenzen hinweg verbreitet werden können:
Diese Funktionalität kann mit der %%memoize Magic kombiniert werden, um eine nahezu Echtzeit-Rendering interaktiver Diagramme zwischen den Zellen zu bieten:
Diese Funktionalität kann mit anderen Erweiterungen wie StickyLand kombiniert werden, um vollständig reaktive Dashboards auf JupyterLab + Ipyflow zu bauen.
Schließlich integriert sich IpyFlow auch in Quecksilber -Widgets:
Ipyflow muss den zugrunde liegenden Ausführungszustand auf einer tiefen Ebene verstehen, um seine Funktionen bereitzustellen. Es enthüllt eine API für die Interaktion mit einem Teil dieses Zustands, einschließlich einer code , um den Code zu erhalten, der zum Rekonstruktion eines Symbols erforderlich ist:
# 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
""" Sie können dies auch auf der Zellebene unter Verwendung der slice() -Methode tun:
from ipyflow import cells
print ( cells ( 4 ). slice ())
# Output:
"""
# Cell 2
x = 0
# Cell 3
y = x + 1
# Cell 4
print(code(y))
""" Sie können auch die Zelle (1-idexed) und die Anweisung (0-idexiert) sehen, wann ein Symbol zuletzt mit der timestamp aktualisiert wurde:
from ipyflow import timestamp
timestamp ( y )
# Timestamp(cell_num=3, stmt_num=0) Um Abhängigkeiten und Angehörige eines bestimmten Symbols anzuzeigen, verwenden Sie die deps bzw. users :
from ipyflow import deps , users
deps ( y )
# [<x>]
users ( x )
# [<y>] Wenn Sie ein Symbol für die interne Darstellung von Ipyflow erhöhen möchten, verwenden Sie die lift (natürlich auf eigenes Risiko):
from ipyflow import lift
y_sym = lift ( y )
y_sym . timestamp
# Timestamp(cell_num=3, stmt_num=0) Reaktivität und andere Frontend -Funktionen funktionieren noch nicht in Schnittstellen wie Colab oder VSCODE. Sie können jedoch weiterhin die Datenflow -API von Ipyflow auf diesen Oberflächen verwenden, indem Sie Ihre Notebook -Sitzung mit dem folgenden Code initialisieren:
%pip install ipyflow
%load_ext ipyflow
Ipyflow begann sein Leben unter dem Namen Nbsafety, der die ersten Vorschläge und die Schnittfunktionalität lieferte.
Für die Ausführungsvorschläge:
@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 }
} Für den dynamischen Slicer (zum Beispiel für die Reaktivität und für die code ):
@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 }
}Für irgendetwas, das nicht in den obigen Papieren bedeckt ist, können Sie das Ipyflow -Repo zitieren:
@misc { ipyflow ,
title = { {IPyflow: A Next-Generation, Dataflow-Aware IPython Kernel} } ,
howpublished = { url{https://github.com/ipyflow/ipyflow} } ,
year = { 2022 } ,
}Ipyflow wäre ohne die erstaunlichen akademischen Mitarbeiter, die in den oben genannten Papieren aufgeführt sind, nicht möglich gewesen. Die reaktiven Ausführungsmerkmale sind von denen anderer hervorragender Werkzeuge wie Hex -Notebooks, Pluto.jl und Observable inspiriert. Ipyflow genießt auch eine Kreuzzahlung von Ideen mit anderen reaktiven Python-Notizbüchern wie Marimo, Jolin.io und Datalore-überprüfen Sie sie auf jeden Fall auch, wenn Sie Ipyflow mögen.
Die Arbeit an Ipyflow hat von der Unterstützung von Leuten von einer Reihe von Unternehmen profitiert - sowohl in Form von direkten finanziellen Beiträgen (Datenbank, Hex) als auch indirekte moralische Unterstützung und Ermutigung (Ponder, Meta). Und natürlich beruht Ipyflow auf den Fundamenten der unglaublichen Jupyter -Community.
Code in diesem Projekt lizenziert unter der BSD-3-Klausel-Lizenz.