[Python-Dev] Generator objects and list comprehensions?
Ivan Levkivskyi
levkivskyi at gmail.com
Wed Jan 25 03:14:27 EST 2017
On 25 January 2017 at 07:01, Chris Angelico <rosuav at gmail.com> wrote:
> >>> [(yield 1) for x in range(10)]
> > <generator object <listcomp> at 0x10cd210f8>
>
This is an old bug, see e.g. http://bugs.python.org/issue10544
The ``yield`` inside comprehensions is bound to the auxiliary function.
Instead it should be bound to an enclosing function, like it is done for
``await``.
The behaviour of ``await`` in comprehensions is intuitive
(since it is simply equivalent to a for-loop):
>>> async def f(i):
... return i
>>> async def g_for():
... lst = []
... for i in range(5):
... lst.append(await f(i))
... print(lst)
>>> g_for().send(None)
[0, 1, 2, 3, 4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> async def g_comp():
... print([await f(i) for i in range(5)])
>>> g_comp().send(None) # exactly the same as g_for
[0, 1, 2, 3, 4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
While current behaviour of ``yield`` in comprehensions is confusing:
>>> def c_for():
... lst = []
... for i in range(5):
... lst.append((yield i))
... print(lst)
>>> c_for().send(None)
0
>>> c_for().send(None)
1
# etc.
>>> def c_comp():
... print([(yield i) for i in range(5)])
>>> c_comp().send(None) # Naively this should be equivalent to the above,
but...
<generator object c_comp.<locals>.<listcomp> at 0x7f1fd1faa630>
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'send'
I promised myself to write a patch, but didn't have time for this yet.
I hope I will do this at some point soon.
--
Ivan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20170125/a423f1c6/attachment.html>
More information about the Python-Dev
mailing list