IPython magic untuk mengedit tag sel Jupyter

Saya datang dengan ide, bahwa akan lebih baik untuk mengedit tag sel dengan bantuan IPython magic daripada mengklik mouse dan berinteraksi dengan tag atau toolbar metadata. Jadi, sekarang saya bisa melakukannya dengan mengetikkan kode ini langsung ke area input sel:


%tags foo bar baz 

TL; DR


Arahkan ke intisari ini untuk melihat cuplikan kode (Lisensi MIT).


Pendahuluan


Proyek Jupyter adalah alat luar biasa untuk pemrograman interaktif dan visualisasi data. Ketika datang untuk mempresentasikan hasil dari upaya pemrograman yang dilakukan di notebook Jupyter Anda ada alat-alat seperti nbconvert dan teman-teman, yang memungkinkan untuk mengekspor hasil pekerjaan ke dalam format PDF atau HTML. Seringkali seseorang ingin memoles buku catatan untuk menghasilkan laporan, misalnya dengan menyembunyikan sel kode tertentu atau melakukan preprocessing lainnya selama konversi. Untuk tujuan ini, Jupyter mendukung pemberian metadata atau tag tambahan ke sel notebook.


Namun, Jupyter UI untuk mengelola metadata sel agak menjengkelkan, karena melibatkan banyak mengklik mouse. Saya ingin tetap menggunakan keyboard dan menggunakan pintasan untuk melakukan sesuatu, jika memungkinkan. Cara yang lebih baik adalah menyimpan informasi ini langsung di sel kode. Kernel Python (IPython) untuk notebook Jupyter mendukung apa yang disebut perintah% magic, yang memungkinkan untuk memperlakukan baris sumber yang sesuai dengan cara kustom apa pun.


Kode


Untuk mengubah metadata sel, kita perlu berbicara dengan kernel Jupyter. A menemukan bahwa ini dimungkinkan dari kode javascript. Untuk menyuntikkannya ke notebook kita dapat menggunakan objek tampilan khusus, misalnya:


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

Di dalam kode javascript, menurut manual: "elemen yang mengandung akan tersedia sebagai element ".


Sekarang kita dapat menulis fungsi pembantu yang akan menemukan sel input yang sesuai dan memodifikasi metadata-nya:


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

Untuk memanipulasi fungsi lingkup, saya menggunakan library needsejs yang tersedia di jupyter.
Terakhir, kami mendefinisikan sihir% kustom yang menggunakan fungsi ini.


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

Pada akhirnya ada tangkapan layar dari semua langkah yang dijelaskan di atas:


Contoh notebook


Dimungkinkan untuk mendefinisikan perintah di atas dalam custom.js dan modul python untuk berbagi kode di berbagai notebook. Masalah yang diketahui: tag bilah alat tidak diperbarui secara otomatis.

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


All Articles