python中的实时补丁



我有一个python测试,其中setUp函数花费了很多时间(几个小时)。我的测试函数失败了,为了调试它并检查如何修复异常,我使用了pdb.

问题是,当我在一行中出现异常时,我用pdb修复它并更改测试函数,我需要再次运行测试,包括非常长的设置,以便到达下一行并检查它,然后再次运行(它抛出一个异常,用pdb, fix等到达它)。

是否有一种方法可以实时修补我的脚本,并继续到下一行,而无需再次运行大厅脚本?

重新加载模块

您可以将频繁更改的部分代码移动到单独的模块并使用importlib.reload。(在python 3.4之前,它是imp.reload,而在python 2中。(它是一个内置函数)

请注意,您应该小心导入:此代码仍将使用过时版本的module -

import changing
from changing import func1
...
func1()
...
reload(changing)  # ← this will reload import module, but separately imported func1 will remain intact
func1()

和这个应该可以-

import changing
...
changing.func1()
...
reload(changing)
changing.func1()  # ← now the new version is called!
<标题>猴子补丁函数

另一种方法,在你的特殊情况下不太方便,是移动变化的代码,例如在模块中的顶级函数,然后替换该函数:

# my_module
def changeable():
    # do something
def test_something():
    ...
    changeable()

and

>>> ...
>>> def new_version():
        ... new actions ...
>>> my_module.changeable = new_version
>>> my_module.test_something()  # ← this will use updated changeable() 

最新更新