不改源代码,我也能给你加点功能!
2025/6/27
不改源代码,我也能给你加点功能!
参考:
- 视频 B站@码农高天 BV1TuKizyEPH
- 仓库 gao
介绍 dowhen
- 如果想打印或修改某些环境,可以直接加代码。但有时源码在库中,无法修改
- 如果只想查看,可以断点,但多次调用则很麻烦
- 最后一种方法如下:
from dowhen import when
import random
when(random.randrange, 302).do("print(istart")
do("print(istart").when(random.randrange, 302) # 写法2, 效果等同
random.randrange(10)
这种在运行时去修改已经存在的函数和代码的行为的手段,叫 MonkeyPatch
或 instrumentation
,这里介绍的一个具体实现是 dowhen
这个库 (@码农高天 写的),简单易用
更多
如果觉得绝对函数不靠谱,还有其他定位手段
when(random.randrange, "+11").do("print(istart") # 相对于函数定义的往下11行
when(random.randrange, "if stop is").do("print(istart") # 定位到指定字符串行
when(random.randrange, ("+11", "if stop is")).do("print(istart") # 需要同时满足多个条件
when(random.randrange, "+11").do(callback) # 这里callback是一个函数,即可以输入函数变量
when(f, "for i").goto("return x") # 除了do也可以用goto
when(f, "for i").goto("return x").do("x = 1") # 可以串联多个命令
相较于fork修改源代码
优点:
- 与上游同步变得轻松
- Overhead (间接成本) 非常低
链接到当前文件 0
没有文件链接到当前文件