【发布时间】:2014-11-05 18:01:46
【问题描述】:
您的程序刚刚在 pdb.set_trace() 处暂停。
有没有办法对当前正在运行的函数进行猴子补丁,并“恢复”执行?
这可以通过调用帧操作实现吗?
一些上下文:
通常,我将有一个处理大量数据的复杂函数,而我先验知道我会找到什么样的数据:
def process_a_lot(data_stream):
#process a lot of stuff
#...
data_unit= data_stream.next()
if not can_process(data_unit)
import pdb; pdb.set_trace()
#continue processing
这种方便的构造在遇到未知数据时会启动一个交互式调试器,因此我可以随意检查它并更改process_a_lot代码以正确处理它。
这里的问题是,当data_stream 很大时,您并不想再次咀嚼所有数据(假设next 很慢,因此您无法保存已有的数据并跳过下次运行)
当然,你可以在调试器中随意替换其他功能。你也可以替换函数本身,但它不会改变当前的执行上下文。
编辑:
由于有些人正在偏离轨道:
我知道有很多方法可以构建您的代码,以便您的处理功能与process_a_lot 分开。我并没有真正询问构建代码的方法,而是询问如何(在运行时)从代码未准备好处理替换的情况中恢复。
【问题讨论】:
-
我不熟悉 pdb,但我想到的解决方案(除了提前弄清楚你在看什么)是有一个函数字典来处理每种输入。遇到新的种类,写一个新的函数,插入到dict中。
-
@user2357112 这是个好主意,是的。 如果你已经预料到了这个问题,有很多方法可以解决这个问题。但很多时候会出现你无法预料的问题(例如,数据结构不同,
str.index引发ValueError)——你不能轻易纠正这些问题 -
现在即时编译如此流行,我想即时编程是下一件大事.. grin.
-
@goncalopp 您可以有一个
reload调用在process_a_lot函数中重新加载包含处理代码的模块。如果您遇到意外数据,您可以修改/创建适当的.py文件并从重新加载再次播放。 -
@Assad 确实,如果您只想修改一个单独的函数,这很容易做到,正如我所提到的。但我想替换函数本身
标签: python function monkeypatching