[Python-Dev] Tricky way of of creating a generator via a comprehension expression

Nathaniel Smith njs at pobox.com
Sat Nov 25 01:18:42 EST 2017


On Fri, Nov 24, 2017 at 9:39 PM, Nick Coghlan <ncoghlan at gmail.com> wrote:
> On 25 November 2017 at 15:27, Nathaniel Smith <njs at pobox.com> wrote:
>> On Fri, Nov 24, 2017 at 9:04 PM, Nick Coghlan <ncoghlan at gmail.com> wrote:
>>>     def example():
>>>         comp1 = yield from [(yield x) for x in ('1st', '2nd')]
>>>         comp2 = yield from [(yield x) for x in ('3rd', '4th')]
>>>         return comp1, comp2
>>
>> Isn't this a really confusing way of writing
>>
>> def example():
>>     return [(yield '1st'), (yield '2nd')], [(yield '3rd'), (yield '4th')]
>
> A real use case

Do you have a real use case? This seems incredibly niche...

> wouldn't be iterating over hardcoded tuples in the
> comprehensions, it would be something more like:
>
>     def example(iterable1, iterable2):
>         comp1 = yield from [(yield x) for x in iterable1]
>         comp2 = yield from [(yield x) for x in iterable2]
>         return comp1, comp2

I submit that this would still be easier to understand if written out like:

def map_iterable_to_yield_values(iterable):
    "Yield the values in iterable, then return a list of the values sent back."
    result = []
    for obj in iterable:
        result.append(yield obj)
    return result

def example(iterable1, iterable2):
    values1 = yield from map_iterable_to_yield_values(iterable1)
    values2 = yield from map_iterable_to_yield_values(iterable2)
    return values1, values2

-n

-- 
Nathaniel J. Smith -- https://vorpus.org


More information about the Python-Dev mailing list