我正在尝试编写Python表达式评估可视化器,它将显示如何逐步评估Python表达式(用于教育目的)。 Philip Guo的Python Tutor非常棒,但它逐行评估Python程序,并且我发现学生有时不明白如何评估单行表达式sorted([4, 2, 3, 1] + [5, 6])[1] == 2
,并且想要将此过程可视化。 (似乎没有人去做,但 - 至少我什么也没发现。)理想的解决方案将创建的字符串这样的顺序:逐步跟踪Python表达式评估
sorted([4, 2, 3, 1] + [5, 6])[1] == 2
sorted(>> [4, 2, 3, 1] + [5, 6] <<)[1] == 2
>> sorted([4, 2, 3, 1, 5, 6]) << [1] == 2
>> [1 2 3 4 5 6][1] << == 2
>> 2 == 2 <<
True
这里>>
和<<
被用来强调的是表达的一部分评估当前步骤,然后用其值替换。 (也许,我会稍后再尝试这个序列转换为某种动画。)
我目前的策略是使用ast.parse()
解析字符串转换成AST,然后发现,将首先评估一个节点,eval(compile(node, '', 'eval'))
对其进行评估(我绝对不希望重新实现整个Python :)),将评估结果转换为AST节点(使用repr
,然后使用ast.parse()
?),并将结果节点替换为当前节点,然后使用codegen.to_source
生成修改后的代码字符串从(修改)AST并继续相同的过程,直到我在树中只有一个文字。
我的问题是:我如何找到一个将首先评估的节点?似乎我可以深入遍历树的子类ast.NodeVisitor
,但我不确定如何检测到我到达了所需的节点,并且如何在它之后停止遍历?
编辑。
有可能我的初始方法与树的转换不可行。实际上,评估Python表达式的基本步骤并不是必须的,它必须将某个子表达式替换为更简单的子表达式(如在算术中)。例如,列表解析提供了一个非常复杂的行为,不能用来代替这个东西,然后递归地重复。所以我重申一个问题。我需要一些编程方法来展示如何逐步评估Python表达式。例如,@ jasonharper提到的MacroPy的tracing功能在此阶段是可接受的解决方案。不幸的是,MacroPy似乎被抛弃了,并且不适用于Python 3.是否有任何想法如何在不移植完整MacroPy的情况下类似于Python 3中的跟踪行为?
EDIT2。
就在我获得这个奖励后,我发现similar question和debugger与非常接近的功能。然而,由于这个问题没有最终答案,而且我也不需要完整的调试器,所以我仍然在寻找一个可以在Jupyter环境中使用的答案。
Hm-m,'macropy''s [tracing](https://github.com/lihaoyi/macropy#tracing)看起来非常接近,很有前途,谢谢。我必须深入研究它。 –
唉,'macropy'不适用于Python 3 :( –