Magie IPython pour modifier les balises de cellules Jupyter

J'ai eu l'idée que ce serait cool de modifier des balises de cellule à l'aide de la magie IPython au lieu de cliquer avec la souris et d'interagir avec des balises ou des barres d'outils de métadonnées. Donc, maintenant je peux le faire en tapant ce code directement dans la zone de saisie de la cellule:


%tags foo bar baz 

TL; DR


Accédez à cet élément pour voir l'extrait de code (licence MIT).


Présentation


Le projet Jupyter est un formidable outil de programmation interactive et de visualisation de données. Lorsqu'il s'agit de présenter le résultat des efforts de programmation effectués dans votre bloc-notes Jupyter, il existe des outils tels que nbconvert et friends, qui permettent d'exporter le résultat du travail au format PDF ou HTML. Souvent, on veut peaufiner le bloc-notes pour générer un rapport, par exemple en masquant certaines cellules de code ou en effectuant un autre prétraitement lors de la conversion. À ces fins, Jupyter prend en charge l'attribution de métadonnées ou de balises supplémentaires aux cellules du bloc-notes.


Cependant, l'interface utilisateur Jupyter pour la gestion des métadonnées de cellule est un peu ennuyeuse, car elle implique beaucoup de clics de souris. J'aime garder les mains sur le clavier et utiliser des raccourcis pour faire les choses, lorsque cela est possible. Une meilleure façon consiste à stocker ces informations directement dans la cellule de code. Le noyau Python (IPython) pour ordinateur portable Jupyter prend en charge les soi-disant commandes% magic, ce qui permet de traiter la ligne source correspondante de n'importe quelle manière personnalisée.


Code


Pour changer les métadonnées des cellules, nous devons parler au noyau Jupyter. A découvert que cela est possible à partir du code javascript. Pour l'injecter dans le cahier, nous pouvons utiliser un objet d'affichage spécial, par exemple:


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

Dans le code javascript, selon le manuel: "l'élément contenant sera disponible comme element ".


Maintenant, nous pouvons écrire une fonction d'aide qui trouverait la cellule d'entrée correspondante et modifierait ses métadonnées:


 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; } }); 

Pour manipuler la portée des fonctions, j'utilise la bibliothèque requirejs disponible dans jupyter.
Enfin, nous définissons un% magic personnalisé qui utilise cette fonction.


 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()) 

À la fin, il y a une capture d'écran de toutes les étapes décrites ci-dessus:


Exemple de cahier


Il est possible de définir les commandes ci-dessus dans custom.js et un module python pour partager le code entre différents blocs-notes. Problème connu: la barre d'outils des balises n'est pas mise à jour automatiquement.

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


All Articles