1

I have multiple generator functions that yield objects which are appended to a list. There's a lot of duplicated code, is there a possibility to minimize this (for Python 3.5+)?

Generators:

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


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

value_errors =[]

Working version but duplicated code:

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)

Not working but no duplicated code:

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

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

This does not work because it yields generators not the generator's yielded value. Is it possible to fix this?

dh762
  • 2,259
  • 4
  • 25
  • 44

3 Answers3

3

You are probably looking for itertools.chain(): https://docs.python.org/3.5/library/itertools.html#itertools.chain

Example:

for yielded in itertools.chain(gen1(obj), gen2(obj)):
    if isinstance(yielded, ValueError):
        value_errors.append(yielded)
dvk
  • 1,420
  • 10
  • 13
0
[obj for generator in generators for obj in generator]
YSelf
  • 2,646
  • 1
  • 14
  • 19
0

Use:

for yielded in generators:
    for _yielded in yielded:
        if isinstance(_yielded, ValueError):
            value_errors.append(_yielded)
hootnot
  • 1,005
  • 8
  • 13