在调试器中更改Python代码

max*_*max 6 python debugging python-3.x

是否有任何调试器允许在调试时更改Python代码?

换句话说:发生运行时异常,调试器停止,我以任何我喜欢的方式更改代码,并告诉程序继续.

我知道这种方法存在的问题,如果我动态地重新定义函数,那么对函数的引用仍将指向旧的定义,依此类推.我很好,因为我只想在非常简单的情况下进行小修复.

另一方面,我也感兴趣的是理论上是否可以允许更改Python代码而不会遇到这些问题:即,以某种方式更新所有对更改的对象的引用,等等.我几乎可以肯定答案第二个问题是否定的,但如果我错了,我想知道.

编辑:如果我的目标(在发生异常时以交互方式更改代码,然后继续执行),可以在没有调试器的情况下实现 - 这也是好的.我不需要使用调试器.

900*_*000 2

由于您可以随时按照您想要的方式更改常规类的内容,因此无需更新对对象的引用:您只需__dict__使用新方法和其他属性更新类即可。

问题在于对函数的引用:您无法在不更改函数标识的情况下更新函数。您可以使用始终按名称查找实际函数的代理函数,并且可以随时更改实际函数。否则,您可以规划代码,使其不会长时间存储函数引用;一旦函数被更新,很快就会通过名称查找它,但是传递到某处的旧引用将继续执行更长的时间。

当您想要在不严重停机的情况下升级长期运行的系统时,这种修补是有意义的:您将其暂停片刻以一致地升级多个类和功能并取消暂停。AFAIK Erlang 以类似的方式进行动态更新。