Python:不修改原实例的迭代器链式拼接实现方案问询
保留原迭代器实例的前置拼接实现
需求是将一个迭代对象前置拼接到另一个迭代对象上,且最终返回的是原对象实例,而非新创建的迭代器。示例代码如下:
iterator1 = range(10) iterator2 = range(10) iterator_chained = keep_instance_chain_left(iterator1, iterator2) assert iterator_chained is iterator2 # 要求断言成立
常用的itertools.chain(iterator1, iterator2)会返回新的迭代器实例,无法满足上述要求:
assert itertools.chain(iterator1, iterator2) is not iterator2 # 此断言成立,不符合需求
实现方案
针对可迭代对象(如range、列表等,而非已激活的迭代器),可以通过修改其__iter__方法来实现需求:
def keep_instance_chain_left(pre_iterable, target_iterable): original_iter = target_iterable.__iter__ def wrapped_iter(): # 先迭代前置的对象 yield from pre_iterable # 再迭代原对象的内容 yield from original_iter() # 替换原对象的__iter__方法 target_iterable.__iter__ = wrapped_iter return target_iterable
注意事项
- 仅适用于可迭代对象:如果
target_iterable是已调用iter()得到的迭代器(如iter(range(10))),此方法不适用——因为迭代器只能被迭代一次,且其__iter__返回自身,修改后无法实现预期的前置拼接效果。 - 存在副作用:此方法会直接修改原对象的
__iter__方法,后续任何对该对象的迭代都会先遍历前置内容,可能影响其他依赖该对象的代码逻辑。 - 内置类型限制:部分内置不可变类型(如
tuple)无法修改其__iter__方法,此时该方案不生效,需改用自定义包装类(但包装类会返回新实例,不符合原需求)。
内容的提问来源于stack exchange,提问作者B.R.
相关产品推荐
相关产品推荐

