7

我想构建一个可视化调试器,它可以帮助编程学生了解表达式评估是如何发生的(子表达式如何被评估并被它们的值“替换”,类似于 Excel 中的表达式评估可视化器)。

看起来您无法使用 Python 的 pdb 逐步完成此过程,因为其最精细的步骤粒度是代码行。是否有可能单步执行 Python 字节码?任何其他想法如何实现这一目标?

编辑:我需要一个可以构建在 CPython 标准库之上的轻量级解决方案。

4

4 回答 4

2

你试过pudb吗? http://pypi.python.org/pypi/pudb 在 debian-like 上:apt-get install python-pudb

它附加到 pdb,所以我想这不是你要找的。至少,当你进入一个函数时,它会清楚地显示你在哪个函数中。

对于教学生,你可以是:

  • 首先,使用变量编写程序,使用几个步骤组成,
  • 使用任何体面的python调试器(pdb,winpdb,pudb ...)调试这个程序,
  • 然后,一旦该过程被很好地理解,就可以摆脱临时变量,通过将代码组合成更少的行,逐渐地,直到你得到最终的代码。

我知道,要做到完美还很遥远,但这是目前我能想到的最好的。

于 2012-12-21T11:22:34.330 回答
1

使用 pdb,可以单步执行任何函数调用。对于任何其他语句,pdb 可以打印该行中相关名称的值。您正在寻找哪些未涵盖的附加功能?

如果您试图“进入”列表理解之类的东西,那么从纯 Python 的角度来看这将不起作用,因为它是单个操作码。在某些时候,对于每个表达式,您都需要告诉学生“这就是 Python 进入 C 实现并评估它的地方……”。

于 2012-12-19T21:38:50.343 回答
1

您应该查看reinteract,它非常简单,您可以为此做出贡献

于 2012-12-19T21:51:20.600 回答
1

我自己也有一个解决方案的想法——我可以通过将所有(子)表达式包装在一个虚拟方法调用中来检测代码(或 AST),这只不过是返回其参数。例如。

x = f(sin(x + y))

变成

x = dummy(f(dummy(sin(dummy(dummy(x) + dummy(y))))))

这样,我保证在每个子表达式被评估后得到通知,并且我也得到了值。我还可以添加有关当前处理表达式的哪一部分的额外位置/AST 信息,例如:

... dummy(x, line=23, col=13, length=1) ...

不幸的是,这需要弄乱 AST 和编译......

于 2012-12-21T10:05:19.737 回答