gpt4 book ai didi

python - 逐步跟踪 Python 表达式求值

转载 作者:太空狗 更新时间:2023-10-29 17:48:26 24 4
gpt4 key购买 nike

我正在尝试编写 Python 表达式评估可视化工具,它将显示如何逐步评估 Python 表达式(用于教育目的)。 Philip Guo 的 Python Tutor 很棒,但是它逐行评估 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
>> 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 环境中使用的答案。

最佳答案

表达式步进在 Thonny IDE 中实现.

它使用 AST 检测,其中每个(子)表达式 e转化为after(before(<location info>), e) .功能beforeafter是在 Python 的跟踪系统中引起额外的 call 事件的虚拟函数。这些额外的调用会在(子)表达式计算即将开始或刚刚结束时发出通知。 (添加了类似的虚拟函数来检测每个语句的开始和结束。)

这些新事件的 AST 检测和解释在 thonny.backend.FancyTracer 中完成.

Python 的 AST 节点包含相应文本范围的起始位置,但它们有时不正确。结束位置完全缺失。 thonny.ast_utils.mark_text_ranges试图解决这个问题(但目前解决方案不完整)。

如果有人将相关功能从 Thonny 提取到一个更通用的包中,那就太好了。甚至可能有两个包——一个用于计算 Python AST 的位置信息,另一个用于详细跟踪 Python 代码。如果有人带头,我愿意为此提供帮助。

关于python - 逐步跟踪 Python 表达式求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40639652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com