Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 修补本地实例_Python_Monkeypatching - Fatal编程技术网

Python 修补本地实例

Python 修补本地实例,python,monkeypatching,Python,Monkeypatching,假设我在python模块a.py中有以下代码: def func(): obj = Obj() # Some code that uses obj 有没有一种方法可以在不将其作为函数参数的情况下对obj进行monkey patch 原因:在代码本身的上下文中,它不应该是一个参数,但是在使用代码进行测试和系统模拟的上下文中,补丁是合理的。此外,在各种情况下,我可能需要修补不同的局部对象,并将它们全部作为参数放置,这将是一件乏味的事情。您可能过于复杂了,请查看控制反转原理。我仍然对

假设我在python模块
a.py
中有以下代码:

def func():
    obj = Obj()
    # Some code that uses obj
有没有一种方法可以在不将其作为函数参数的情况下对obj进行monkey patch


原因:在代码本身的上下文中,它不应该是一个参数,但是在使用代码进行测试和系统模拟的上下文中,补丁是合理的。此外,在各种情况下,我可能需要修补不同的局部对象,并将它们全部作为参数放置,这将是一件乏味的事情。

您可能过于复杂了,请查看控制反转原理。我仍然对如何在Python中实现这一点感兴趣。可能:)虽然应用程序一开始很复杂,所以我有一些借口。。。我仍然想知道这个monkeypatching是如何完成的,它可以为我节省大量的工作,所以他说的是:用你的函数导入模块并对类进行MonkeyPatch,而不是变量。哦。。。但是如果我只在某个函数中需要这个补丁,而不是在整个
a.py
中需要它呢?@Jonathan:在调用
a.func()
之后,你可以将
a.Obj
恢复到以前的值
a
中内部使用,然后可以
导入a
然后设置
a.func=local\u func
并让
local\u func
执行:1)覆盖
a.Obj
2)调用原始
a.func
3)恢复
a.Obj
# if func() is defined in `a.py`
import a

oldObj, a.Obj = a.Obj, MockObj
a.func()
a.Obj = oldObj