[Python-Dev] Tricky way of of creating a generator via a comprehension expression (original) (raw)

Ivan Levkivskyi levkivskyi at gmail.com
Wed Nov 22 11:38:11 EST 2017


On 22 November 2017 at 17:16, Paul Moore <p.f.moore at gmail.com> wrote:

On 22 November 2017 at 16:08, Ivan Levkivskyi <levkivskyi at gmail.com> wrote: > On 22 November 2017 at 16:56, Yury Selivanov <yselivanov.ml at gmail.com> > wrote: >> >> On Wed, Nov 22, 2017 at 10:10 AM, Ivan Levkivskyi <levkivskyi at gmail.com_ _> >> wrote: >> > On 22 November 2017 at 15:47, Paul Moore <p.f.moore at gmail.com> wrote: >> [...] >> I'm all for prohibiting using 'yield' expression in generator >> expressions or comprehensions. The semantics is way to hard to >> understand and hence be of any value. >> >> Making 'await' a SyntaxError is absolutely not an option. Async >> generator expressions are a shorthand syntax for defining asynchronous >> generators (PEP 525), and it's already being used in the wild. > > > OK, makes sense, so it looks like we may have the following plan: > > - fix yield in comprehensions

I'm still not clear what "fix" would actually mean, but you propose clarifying the docs below, so I assume it means "according to whatever the updated docs say"... I mean the initial proposal: make comprehensions equivalent to a for-loop

> - update PEP 530 and docs re generator expressions vs comprehensions

Docs more importantly than PEP IMO. And are you implying that there's a difference between generator expressions and comprehensions? I thought both were intended to behave as if expanded to a function containing nested for loops? Nothing said in this thread so far (about semantics, as opposed to about current behaviour) implies there's a deliberate difference.

I think there may be a difference:

comprehension g = [(yield i) for i in range(3)] is defined as this code:

__result = []
__i = None
try:
    for __i in range(3):
        __result.append(yield __i)
    g = __result
finally:
    del __result, __i

while g = list((yield i) for i in range(3)) is defined as this code:

def __gen():
   for i in range(3):
     yield (yield i)
g = list(__gen())

Although these two definitions are equivalent in simple cases (like having f(i) instead of yield i)

But this is debatable, I think before we move to other points we need to agree on the clear definitions of semantics of generator expressions and comprehensions.

-- Ivan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/python-dev/attachments/20171122/8b2e865a/attachment.html>



More information about the Python-Dev mailing list