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

将MagicMock实例赋值给另一MagicMock的return_value后名称异常问题

关于MagicMock实例方法返回值名称变化的疑问解答

首先得告诉你,这其实是MagicMock的内置追踪机制在起作用,完全不是你的代码写错啦!

为什么g的名称会变成mock.goo()?

当你把g赋值给f.goo.return_value时,MagicMock会自动给这个返回值的实例关联父Mock的调用上下文——简单说就是给g的name属性更新成父Mock的方法调用路径,这样后续你调试、查看Mock调用记录的时候,能一眼看出来这个Mock实例是从哪个方法返回的,方便追踪调用链路。

你可以仔细对比一下g的id,从头到尾都是同一个值,说明实例本身根本没被修改或替换,只是它的元数据(name属性)被MagicMock做了关联标记而已。

关于调用f.goo(1,2)的补充说明

不管你给f.goo传什么参数,它返回的始终是你设置的g实例。而且因为之前已经关联了上下文,g的名称不会再因为这次调用改变,同时f.goo的调用记录会被完整保存下来——你可以通过f.goo.call_args查看刚才传入的(1,2)参数,验证调用是否被正确记录。

给你补个验证的小例子:

import mock

f = mock.MagicMock()
g = mock.MagicMock()
print("初始g的name:", g.name)  # 输出类似 'mock'
print("初始g的id:", id(g))

f.goo.return_value = g
print("赋值后g的name:", g.name)  # 输出 'mock.goo()'
print("赋值后g的id:", id(g))  # 和初始id完全一致

f.goo(1,2)
print("调用f.goo后返回的实例id:", id(f.goo(1,2)))  # 还是同一个g的id
print("f.goo的调用参数:", f.goo.call_args)  # 输出 call((1, 2), {})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:15:24