Python使用`yield from`时触发递归深度超限错误的问题排查
解决
yield from展开嵌套结构时的递归错误问题 你碰到的这个问题核心原因很明确:字符串(包括bytes、bytearray这类字符序列类型)在Python里属于可迭代对象,你的代码用hasattr(i, '__iter__')判断是否要递归展开,但字符串满足这个条件,而且当你递归处理字符串的每个字符时,每个字符本身还是字符串,直接就陷入了无限递归循环,最终触发RecursionError。
问题具体拆解
拿字符串'a'举例:
- 代码检测到它有
__iter__方法,调用unpack('a') - 遍历
'a'得到唯一元素'a' - 再次检测这个字符仍有
__iter__方法,继续递归调用unpack('a') - 这个过程会无限重复,直到触及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
相关产品推荐
相关产品推荐

