gpt4 book ai didi

Python 函数引用

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:02 24 4
gpt4 key购买 nike

我正在尝试模拟一个函数并修饰它的行为。为此,我必须获取原始函数行为,将其保存并将其添加到包装函数中。应该看起来像这样:

@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

谁能向我解释为什么第一个有效,而其余的无效?

最佳答案

为什么第一个有效?

之所以有效,是因为您在模块级别对函数进行猴子修补,修改后的值将一直保留到模块保留在 sys.modules 中。 .

基本上当你这样做的时候:

from package import original_function

这添加了对 original_function 的新引用当前命名空间中的对象,现在如果您执行以下操作:

package.original_function = 1

您正在更新该模块的命名空间以生成 original_function指向 1,但这并不意味着已经导入的 original_function也应该改变。

为什么其他人失败了?

  1. original_function = Mock(wraps= wrap_function)定义了一个新的局部变量,它不会对任何一个 package.original_function 产生任何影响。或 original_function .

  2. package.original_function = Mock(wraps= wrap_function) :模拟是正确的,但我们再次调用相同的模拟函数而不是 wrap_function 中的实际函数.

  3. original_function = Mock(wraps= wrap_function) : 和1一样,我们定义了一个局部变量,会用到同样的函数wrap_function也因为它位于其封闭范围内。

关于Python 函数引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46218341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com