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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:47:25