触发TypeError:'set' object is not subscriptable报错如何排查解决
错误根因
你遇到的TypeError: 'set' object is not subscriptable错误本质是类型不匹配:
- 当模板匹配成功时,
TryToFindCardInGame返回max_loc,这是cv2.minMaxLoc输出的元组类型,支持[0]下标访问 - 当模板匹配失败时,你返回的是
{-1, -1},这是Python的集合(set)类型,集合是无序且不支持下标索引的,当你调用pos[0]时就会触发报错
排查修复方向
- 首先修正失败场景的返回值类型:把
TryToFindCardInGame最后一行的return {-1, -1}改为return (-1, -1),统一返回元组类型,和成功场景的返回格式保持一致 - 增加返回值类型校验:在
CatchingCard函数拿到pos之后、访问下标前,增加类型校验逻辑,比如if not isinstance(pos, (tuple, list)):提前抛出更明确的报错,方便后续调试定位 - 清理无效代码:
TryToFindCardInGame里的assert isinstance(max_val, object)、assert isinstance(cardImage.thumbnail, object)这两行断言永远为真(所有Python对象都属于object子类),单独写的cardImage.thumbnail、colorLayout.shape[::-1]也没有执行任何实际操作,这些冗余代码可以直接删除,避免干扰调试 - 补充边界场景测试:专门测试卡片匹配失败的场景,验证修改后的逻辑是否正常运行,比如传入不存在的卡片路径测试返回值处理逻辑
内容的提问来源于stack exchange,提问作者Runelegends
相关产品推荐
相关产品推荐

