我正在尝试为一种不真正支持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作为基础,我查看了源代码,但是找不到任何可以帮助我的东西。有什么我想念的吗?我应该做些其他事情吗?
答案 0 :(得分:2)
有一种可能的解决方案可以使用messages_api(https://jupyter-client.readthedocs.io/en/latest/messaging.html#history)。
URLSession
让我尝试解释一下...
我们在Cell数据类(代码,索引和执行计数)的列表(单元)上跟踪所有笔记本单元格及其索引。
我们从所需会话中监听每条消息(方法监听)
当执行单元格获取操作时,我们通过消息api请求其历史记录,以获取代码和execution_count
我们将与现有单元格匹配的单元格与他的execution_count匹配并更新它
我知道这是一个非常奇特的解决方案,但是当笔记本与message api通信时,它不包含有关某种单元格标识的任何信息,仅包含他的代码。
重要提示
此解决方案无法管理单元格的插入或删除,我们必须使用内核历史记录或类似的内容来找到解决方案...