遍历多个生成器

时间:2018-06-20 13:38:55

标签: python python-3.x generator

我有多个生成器函数,这些函数生成会附加到列表中的对象。有很多重复的代码,是否有可能将其最小化(对于Python 3.5 +)?

生成者:

def gen1(obj):
    if obj == 'something':
        yield ValueError()


def gen2(obj):
    if obj == 'else':
        yield ValueError()

value_errors =[]

工作版本,但代码重复:

for exc in gen1(obj):
    if isinstance(exc, ValueError):
        value_errors.append(exc)

for exc in gen2(obj):
    if isinstance(exc, ValueError):
        value_errors.append(exc)

不起作用,但没有重复的代码:

generators = [
    gen1(obj),
    gen2(obj)
]

for yielded in generators:
    if isInstance(yielded, ValueError):
        value_errors.append(yielded)
)

这不起作用,因为它产生的是发生器而不是发生器的屈服值。可以解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

您可能正在寻找itertools.chain()https://docs.python.org/3.5/library/itertools.html#itertools.chain

示例:

for yielded in itertools.chain(gen1(obj), gen2(obj)):
    if isinstance(yielded, ValueError):
        value_errors.append(yielded)

答案 1 :(得分:1)

使用:

for yielded in generators:
    for _yielded in yielded:
        if isinstance(_yielded, ValueError):
            value_errors.append(_yielded)

答案 2 :(得分:0)

[obj for generator in generators for obj in generator]