如何获取Jupyter内核中的单元格ID?

时间:2019-03-06 18:15:25

标签: ipython jupyter

我正在尝试为一种不真正支持REPL的语言构建Jupyter内核,并且重新定义变量或函数会在该语言中引发错误。不幸的是,这意味着我不能仅仅按照用户提交代码的顺序继续执行代码,而是如果他们重新访问较旧的单元,则需要替换它。假设用户具有以下两个单元格:

单元格1:

int foo = 1;

单元2:

vec4(foo);

在我理想的情况下,我只想将单元格拼接成一个按单元格顺序的虚拟源文件,然后执行该文件。因此,生成的虚拟源文件应为:

int foo = 1;
vec4(foo);

现在,假设用户返回到单元格1并将foo修改为4,我如何才能发现用户编辑了单元格1?因此,理想情况下,我想将虚拟源文件更新为如下所示:

int foo = 4;
vec4(foo);

代替此:

int foo = 1;
vec4(foo);
int foo = 4; // This would throw an error in the language compiler

我使用this作为基础,我查看了源代码,但是找不到任何可以帮助我的东西。有什么我想念的吗?我应该做些其他事情吗?

1 个答案:

答案 0 :(得分:2)

有一种可能的解决方案可以使用messages_api(https://jupyter-client.readthedocs.io/en/latest/messaging.html#history)。

URLSession

让我尝试解释一下...

  • 我们在Cell数据类(代码,索引和执行计数)的列表(单元)上跟踪所有笔记本单元格及其索引。

  • 我们从所需会话中监听每条消息(方法监听)

  • 当执行单元格获取操作时,我们通过消息api请求其历史记录,以获取代码和execution_count

  • 我们将与现有单元格匹配的单元格与他的execution_count匹配并更新它

我知道这是一个非常奇特的解决方案,但是当笔记本与message api通信时,它不包含有关某种单元格标识的任何信息,仅包含他的代码。

重要提示

此解决方案无法管理单元格的插入或删除,我们必须使用内核历史记录或类似的内容来找到解决方案...