我正在尝试模拟一个函数并修饰它的行为。为此,我必须得到原始的函数行为,保存并将其添加到wrap函数。应该是这样的:
@classmethod
def setUpClass(cls):
def wrap_function(arg):
return "potato" + original_function(arg)
package.original_function = Mock(wraps= wrap_function)
此代码有效,但以下任何变体均无效。
1)
@classmethod
def setUpClass(cls):
def wrap_function(arg):
return "potato" + package.original_function(arg)
original_function = Mock(wraps= wrap_function)
2)
@classmethod
def setUpClass(cls):
def wrap_function(arg):
return "potato" + package.original_function(arg)
package.original_function = Mock(wraps= wrap_function)
3)
@classmethod
def setUpClass(cls):
def wrap_function(arg):
return "potato" + original_function(arg)
original_function = Mock(wraps= wrap_function)
我已经导入了两个
import package
from package import original_function
有人可以向我解释为什么第一个确实有效,其余的没有?
答案 0 :(得分:2)
它的工作原理是因为你在模块级修改函数,修改后的值将保持不变,直到模块保持在sys.modules
。
基本上当你这样做时:
from package import original_function
这会在当前命名空间中添加对original_function
对象的新引用,现在如果您执行以下操作:
package.original_function = 1
您正在更新该模块的命名空间以使original_function
指向1,但这并不意味着已导入的original_function
也应该更改。
original_function = Mock(wraps= wrap_function)
定义了一个新的局部变量,对package.original_function
或original_function
没有任何影响。
package.original_function = Mock(wraps= wrap_function)
:模拟是正确的,但我们再次调用相同的模拟函数,而不是wrap_function
中的实际函数。
original_function = Mock(wraps= wrap_function)
:与1相同,我们定义了一个局部变量,同样的函数也将使用wrap_function
,因为它位于其封闭范围内。