IPython-Magie zum Bearbeiten von Jupyter-Zellen-Tags

Ich hatte die Idee, dass es cool wäre, Zellen-Tags mit Hilfe von IPython-Magie zu bearbeiten, anstatt mit der Maus zu klicken und mit Tags oder Metadaten-Symbolleisten zu interagieren. Jetzt kann ich diesen Code direkt in den Zelleingabebereich eingeben:


%tags foo bar baz 

TL; DR


Navigieren Sie zu diesem Kern , um das Code-Snippet (MIT-Lizenz) anzuzeigen .


Einführung


Das Jupyter- Projekt ist ein erstaunliches Werkzeug für die interaktive Programmierung und Datenvisualisierung. Wenn es darum geht, das Ergebnis der Programmierbemühungen in Ihrem Jupyter-Notizbuch zu präsentieren, gibt es Tools wie nbconvert und friends, mit denen Sie das Ergebnis der Arbeit in das PDF- oder HTML-Format exportieren können. Oft möchte man das Notizbuch polieren, um einen Bericht zu erstellen, indem man beispielsweise bestimmte Codezellen ausblendet oder während der Konvertierung eine andere Vorverarbeitung durchführt. Zu diesem Zweck unterstützt Jupyter das Zuweisen zusätzlicher Metadaten oder Tags zu den Notizbuchzellen.


Die Jupyter-Benutzeroberfläche zum Verwalten von Zellmetadaten ist jedoch etwas ärgerlich, da viel Mausklick erforderlich ist. Ich mag es, meine Hände auf der Tastatur zu halten und Verknüpfungen zu verwenden, wenn es möglich ist. Eine bessere Möglichkeit besteht darin, diese Informationen direkt in der Codezelle zu speichern. Der Python-Kernel (IPython) für Jupyter Notebook unterstützt sogenannte% magic-Befehle, mit denen die entsprechende Quellzeile auf benutzerdefinierte Weise behandelt werden kann.


Code


Um die Zellmetadaten zu ändern, müssen wir mit dem Jupyter-Kernel sprechen. A fand heraus, dass dies aus dem Javascript-Code möglich ist. Um es in das Notizbuch zu injizieren, können wir ein spezielles Anzeigeobjekt verwenden, zum Beispiel:


 from IPython.display import Javascript, display display(Javascript('alert("hi!")')) 

Innerhalb des Javascript-Codes laut Handbuch: "Das enthaltende Element wird als element verfügbar sein".


Jetzt können wir eine Hilfsfunktion schreiben, die die entsprechende Eingabezelle findet und ihre Metadaten ändert:


 define('setTags', function() { return function(element, tags) { var cell_element = element.parents('.cell'); var index = Jupyter.notebook.get_cell_elements().index(cell_element); var cell = Jupyter.notebook.get_cell(index); cell.metadata.tags = tags; } }); 

Um den Funktionsumfang zu manipulieren, verwende ich die in jupyter verfügbare requirejs- Bibliothek.
Schließlich definieren wir benutzerdefinierte% magic, die diese Funktion verwendet.


 from IPython.core.magic import register_cell_magic, register_line_cell_magic from IPython.display import Javascript, display import json def _set_tags(tags): assert all(map(lambda t: isinstance(t, str), tags)) display(Javascript( """ require(['setTags'], function(setTags) { setTags(element, %s); }); """ % json.dumps(tags) )) @register_line_cell_magic def tag(line, cell=None): _set_tags(line.split()) 

Am Ende gibt es einen Screenshot aller oben beschriebenen Schritte:


Beispiel Notizbuch


Es ist möglich, die obigen Befehle in custom.js und einem Python-Modul zu definieren, um den Code für verschiedene Notebooks freizugeben. Bekanntes Problem: Die Tag-Symbolleiste wird nicht automatisch aktualisiert.

Source: https://habr.com/ru/post/de439570/


All Articles