You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Mock中筛选出对应call_count的目标调用记录?

筛选MagicMock调用记录,仅保留对应call_count的顶层调用

问题重现

代码示例:

from mock import MagicMock

mock = MagicMock()
mock.get_query(arg=1).execute()
mock.get_query(arg=2).execute()

print('count:', mock.get_query.call_count)
print('calls:', mock.get_query.mock_calls)

实际输出:

count: 2
calls: [call(arg=1), call().execute(), call(arg=2), call().execute()]

期望输出:

count: 2
calls: [call(arg=1), call(arg=2)]

解决方案

方法1:直接使用call_args_list属性

MagicMock的call_args_list属性专门存储当前mock对象的所有直接调用记录,完全匹配call_count统计的次数,无需手动筛选。

修改后的代码:

from mock import MagicMock

mock = MagicMock()
mock.get_query(arg=1).execute()
mock.get_query(arg=2).execute()

print('count:', mock.get_query.call_count)
print('calls:', mock.get_query.call_args_list)

输出结果与期望完全一致。

方法2:手动筛选mock_calls

如果必须从mock_calls中筛选,可以通过判断调用记录的parent属性是否指向当前mock对象来过滤子mock的调用:

from mock import MagicMock

mock = MagicMock()
mock.get_query(arg=1).execute()
mock.get_query(arg=2).execute()

filtered_calls = [call for call in mock.get_query.mock_calls if call.parent is mock.get_query]

print('count:', mock.get_query.call_count)
print('calls:', filtered_calls)

该方法同样能得到目标结果,但不如第一种方式简洁直接,推荐优先使用call_args_list。

内容的提问来源于stack exchange,提问作者Jerther

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:01:06