是否有任何调试器允许在调试时更改Python代码?
换句话说:发生运行时异常,调试器停止,我以任何我喜欢的方式更改代码,并告诉程序继续。
我知道这种方法的问题,如果我动态地重新定义函数,那么对函数的引用仍将指向旧的定义,依此类推。我很好,因为我只想在非常简单的情况下做一些小修补。
另一方面,我也感兴趣的是理论上是否可以允许更改Python代码而不会遇到这些问题:即,以某种方式更新所有对已更改的对象的引用,等等。我几乎可以肯定第二个问题的答案是否定的,但如果我错了,我想知道。
编辑:如果我的目标(在发生异常时以交互方式更改代码,然后继续执行),可以在没有调试器的情况下实现 - 这也是好的。我不需要使用调试器。
答案 0 :(得分:1)
由于您可以随时以您希望的方式更改常规类的内容,因此无需更新对象的引用:您只需使用新方法和其他属性更新类__dict__
。
问题在于对函数的引用:您无法在不更改其标识的情况下更新函数。您可以使用始终按名称查找实际函数的代理函数,并随时更改实际函数。否则,您计划代码,以便它不会长时间存储函数引用;一旦函数更新,它很快就会被名称查找,但是传递到某个地方的旧引用将继续执行一段时间。
当您想要在没有严重停机的情况下升级它时,这样的修补对于长时间运行的系统是有意义的:您暂停一下,以便一致地升级多个类和函数并且不停顿。 AFAIK Erlang以类似的方式进行即时更新。
答案 1 :(得分:1)
是的,pdb可以做到这一点。虽然您必须在另一个编辑器中进行编辑,但在重新启动之前将忽略更改。
但是,既然你想做的只是微小的改变,这不是问题。但是你不能改变正在运行的代码(除了重载,见下文),因为更改代码意味着代码和状态不同步。
使用调试器可以执行的操作是测试您要执行的更改。您可以根据需要粘贴代码,然后在不重新运行整个程序的情况下测试它是否正确。但在这种情况下,您不会编辑该文件。
(在某些特定情况下,您可以通过小心使用“reload()”来避免重新启动,但这可能不值得付出努力。)
答案 2 :(得分:1)
您可以使用xreload:
更新正在运行的python进程中的代码http://svn.python.org/projects/sandbox/trunk/xreload/xreload.py
有许多限制,它们列在文件的顶部。我不确定这是否会处理您想要的情况 - 您是否希望实际阻止异常传播?这需要的不仅仅是更新正在运行的程序。
答案 3 :(得分:0)
理论上是否可以允许更改Python代码
是。可以“动态”更新代码对象。 Python VM中的任何内容似乎都无法阻止这一点。目前还没有对校验和或其他任何内容进行验证。
以某种方式更新所有对已更改对象的引用,
这甚至没有意义。一旦更改了类级方法定义,“更新”所有引用甚至不是必需的或合理的。代码在唯一存在的地方被更改。
这就是调试器坏的原因。他们似乎导致黑暗,不清晰的思想。过多地考虑调试器意味着对现有问题的思考太少。
TDD是一项远远更好的投资。小型,可管理的单元测试运行迅速,并提供持久的证据证明事情有效。答案 4 :(得分:-2)
name =(input(“输入名称:”))
如果名称==“ e”: 打印(“这个词有一个字母e”)
其他: print(“这个词没有字母e”)