[英]Python: Weird behavior while using `yield from`
在以下代码中,我遇到了RecursionError: maximum recursion depth exceeded
。
def unpack(given):
for i in given:
if hasattr(i, '__iter__'):
yield from unpack(i)
else:
yield i
some_list = ['a', ['b', 'c'], 'd']
unpacked = list(unpack(some_list))
如果我使用some_list = [1, [2, [3]]]
,这很好用,但是当我尝试使用字符串时却不能。
我怀疑我对python的了解不足。 任何指导表示赞赏。
字符串是无限可迭代的。 甚至一个字符的字符串都是可迭代的。
因此,除非为字符串添加特殊处理,否则总是会产生堆栈溢出:
def flatten(x):
try:
it = iter(x)
except TypeError:
yield x
return
if isinstance(x, (str, bytes)):
yield x
return
for elem in it:
yield from flatten(elem)
注意:使用hasattr(i, '__iter__')
不足以检查i
是否可迭代,因为还有其他方法可以满足迭代器协议。 确定对象是否可迭代的唯一可靠方法是调用iter(obj)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.