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

Python使用`yield from`时触发递归深度超限错误的问题排查

解决yield from展开嵌套结构时的递归错误问题

你碰到的这个问题核心原因很明确:字符串(包括bytes、bytearray这类字符序列类型)在Python里属于可迭代对象,你的代码用hasattr(i, '__iter__')判断是否要递归展开,但字符串满足这个条件,而且当你递归处理字符串的每个字符时,每个字符本身还是字符串,直接就陷入了无限递归循环,最终触发RecursionError。

问题具体拆解

拿字符串'a'举例:

  1. 代码检测到它有__iter__方法,调用unpack('a')
  2. 遍历'a'得到唯一元素'a'
  3. 再次检测这个字符仍有__iter__方法,继续递归调用unpack('a')
  4. 这个过程会无限重复,直到触及Python的递归深度上限

解决方案:排除字符序列类可迭代对象

我们需要在判断条件里加入排除逻辑,只对真正的容器类可迭代对象(比如列表、元组、集合等)进行递归展开,跳过字符串这类不需要拆分的可迭代类型。

修改后的代码如下:

def unpack(given):
    for i in given:
        # 排除字符串、bytes等字符序列,仅处理容器类可迭代对象
        if hasattr(i, '__iter__') and not isinstance(i, (str, bytes, bytearray)):
            yield from unpack(i)
        else:
            yield i

测试验证

  • 测试纯数字嵌套列表:
    some_list = [1, [2, [3]]]
    print(list(unpack(some_list)))  # 输出: [1, 2, 3]
    
  • 测试包含字符串的列表:
    some_list = ['a', ['b', 'c'], 'd']
    print(list(unpack(some_list)))  # 输出: ['a', 'b', 'c', 'd']
    

额外说明

如果你的业务场景里还有其他不需要展开的可迭代类型(比如range对象),直接把对应的类型添加到isinstance的判断元组里就可以了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:32:47