Python函数引用

时间:2017-09-14 11:49:35

标签: python python-3.x python-import

我正在尝试模拟一个函数并修饰它的行为。为此,我必须得到原始的函数行为,保存并将其添加到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

有人可以向我解释为什么第一个确实有效,其余的没有?

1 个答案:

答案 0 :(得分:2)

为什么第一个有效?

它的工作原理是因为你在模块级修改函数,修改后的值将保持不变,直到模块保持在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_functionoriginal_function没有任何影响。

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

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