如何逐步完成Python表达式评估过程?

时间:2012-12-13 11:22:29

标签: python debugging pdb

我想构建一个可视化调试器,它可以帮助编程学生了解表达式评估是如何进行的(子表达式如何通过它们的值进行评估和“替换”,例如Excel中的表达式评估可视化器)。

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

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

4 个答案:

答案 0 :(得分:2)

你尝试过pudb吗?  http://pypi.python.org/pypi/pudb 在像debian一样:  apt-get install python-pudb

它附加到pdb,所以我想这不是你想要的。至少,当您单步执行某个功能时,它会清楚地显示您所在的功能。

对于教学生来说,你可以做到:

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

我知道,这是完美的,但这是我能想到的最好的。

答案 1 :(得分:1)

使用pdb,可以进入任何函数调用。对于任何其他语句,pdb可以在行中打印相关名称的值。您还在寻找哪些额外功能?

如果你试图“进入”列表理解之类的东西,那么从纯粹的Python角度来看这是行不通的,因为它只是一个操作码。在某些时候,你需要告诉你的学生每个表达式,这就是Python进入C实现并评估这个......'。

答案 2 :(得分:1)

您应该查看reinteract,这很简单,您可以为此做出贡献

答案 3 :(得分: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和编译......