Python 检查函数是否在未更改其行为的情况下被调用

Python 检查函数是否在未更改其行为的情况下被调用,python,python-3.x,Python,Python 3.x,我如何测试调用了python函数,而根本不改变其行为 有许多相关的帖子,但我找不到其中一篇涵盖所有内容: (改变行为) (不适用于参数和返回值) 基本上,我只需要监视这个函数,就可以知道它是否被调用了 例如,下面的代码片段具有非常令人惊讶的行为 from unittest.mock import patch def func(a,b): print('was called') return a * b with patch('test.func') as patched_

我如何测试调用了python函数,而根本不改变其行为

有许多相关的帖子,但我找不到其中一篇涵盖所有内容:

  • (改变行为)
  • (不适用于参数和返回值)
基本上,我只需要监视这个函数,就可以知道它是否被调用了

例如,下面的代码片段具有非常令人惊讶的行为

from unittest.mock import patch

def func(a,b):
    print('was called')
    return a * b

with patch('test.func') as patched_function:
    print(func(4,5))

print(patched_function.called)
输出:

<MagicMock name='func()' id='1721737249456'>
True
was called
20
False

您应该为函数创建一个装饰器,如下所示:

class CheckCall(object):
    called = False

    def __init__(self, func):
        self.func = func

    def __call__(self *args, **kwargs):
        self.called = True
        return self.func(*args, **kwargs)
然后你可以像这样使用你的装饰师

with patch('test.func') as patched_function:
    patched_function = CheckCall(patched_function)
    print(patched_function.called) # Prints False
    patched_function(...)
    print(patched_function.called) # Prints True

第一次调用时,使用设置为
True
的全局变量?如果
func
位于无法修改的模块内,则该全局变量不起作用,这几乎总是修补时需要的。您还可以使用全局变量作为函数调用次数的计数器。类似于:
def func(i):i+=1
我无法修改
func
,它不在我的代码库中。看到我上面的评论,我想它已经在unittest中实现了。如果使用unittest没有答案,我将接受你的答案
with patch('test.func') as patched_function:
    patched_function = CheckCall(patched_function)
    print(patched_function.called) # Prints False
    patched_function(...)
    print(patched_function.called) # Prints True