IPython魔术来编辑Jupyter细胞标记

我想出了一个主意,那就是借助IPython magic来编辑单元格标签会很酷,而不是单击鼠标并与标签或元数据工具栏进行交互。 因此,现在我可以通过直接在单元格输入区域中键入以下代码来做到这一点:


%tags foo bar baz 

TL; DR


导航至该要点,以查看代码片段(MIT许可证)。


引言


Jupyter项目是用于交互编程和数据可视化的出色工具。 要显示在Jupyter笔记本中完成的编程工作的结果,可以使用nbconvert和friends之类的工具,这些工具可以将工作结果导出为PDF或HTML格式。 通常,人们想抛光笔记本以生成报告,例如通过隐藏某些代码单元或在转换过程中进行其他预处理。 为此,Jupyter支持将其他元数据或标签分配给笔记本单元。


但是,用于管理单元元数据的Jupyter UI有点烦人,因为它涉及很多鼠标单击。 我喜欢把手放在键盘上,并尽可能使用快捷方式进行操作。 更好的方法是将这些信息直接存储在代码单元中。 Jupyter笔记本的Python内核(IPython)支持所谓的%magic命令,该命令允许以任何自定义方式处理相应的源代码行。


代号


要更改单元元数据,我们需要与Jupyter内核进行对话。 从javascript代码中发现这是可能的。 要将其注入笔记本,我们可以使用特殊的显示对象,例如:


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

在javascript代码中,根据手册:“ contains元素将可用作element ”。


现在我们可以编写一个帮助程序函数,该函数将查找对应的输入单元格并修改其元数据:


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

为了操纵函数范围,我使用jupyter中提供的requirejs库。
最后,我们定义使用此功能的自定义%magic。


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

最后是上述所有步骤的屏幕截图:


示例笔记本


可以在custom.js和python模块中定义上述命令,以在不同笔记本之间共享代码。 已知问题:标记工具栏不会自动更新。

Source: https://habr.com/ru/post/zh-CN439570/


All Articles