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

如何处理MagicMock回调问题?获取其函数指针的方法

解决方案

你不需要专门“获取函数指针”,利用MagicMock的调用记录就能拿到传入的回调函数,手动执行它即可结束无限等待。

关键原理

MagicMock会自动记录所有调用的参数和行为,通过它的call_args属性可以获取最近一次调用的参数列表,从中就能提取出传入的pushback_callback。

修改后的测试代码

首先要修复原代码的一个小问题:pushback_callback里修改全局wait变量时,必须声明global wait,否则只会创建局部变量,无法触发循环结束。然后调整测试逻辑,用线程避免主线程被阻塞:

import unittest
from mock import Mock, MagicMock
import time
import threading

wait = False

def pushback_callback(self, res):
    print("Received callback")
    global wait  # 声明为全局变量,确保修改生效
    wait = True
  
def pushback_fcn(callback):
    print("pushback_fcn")
  
def execute():
    pushback_fcn(pushback_callback)
    while wait == False:
        time.sleep(1)  # 缩短等待时间,方便测试
    print("done")
            
#********* 修改后的测试代码 ************#
pushback_fcn = MagicMock()

# 用线程运行execute,避免阻塞主线程
execute_thread = threading.Thread(target=execute)
execute_thread.start()

# 短暂等待,确保pushback_fcn已被调用
time.sleep(0.5)

# 从MagicMock的调用记录中提取回调函数
# call_args[0]是位置参数元组,[0]取第一个参数(即传入的callback)
target_callback = pushback_fcn.call_args[0][0]
# 执行回调,参数传None即可(原函数的self和res在这里不需要实际值)
target_callback(None, None)

# 等待线程执行完成
execute_thread.join()

其他可用属性

如果需要查看所有调用记录,可以用pushback_fcn.call_args_list,它会返回所有调用的参数列表;pushback_fcn.mock_calls则会返回更详细的调用行为记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:45:52