I'm trying to use Python 3.6's async comprehensions in a MacOS Sierra (10.12.2), but I'm receiving a SyntaxError
.
Here is the code I've tried:
print( [ i async for i in range(10) ] )
print( [ i async for i in range(10) if i < 4 ] )
[i async for i in range(10) if i % 2]
I am receiving a syntax error for async loops:
result = []
async for i in aiter():
if i % 2:
result.append(i)
All code is copy/paste from the PEP.
Terminal Output:
>>> print([i for i in range(10)])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print([i async for i in range(10)])
File "<stdin>", line 1
print([i async for i in range(10)])
^
SyntaxError: invalid syntax
>>> print([i async for i in range(10) if i < 4])
File "<stdin>", line 1
print([i async for i in range(10) if i < 4])
^
SyntaxError: invalid syntax
>>>
This behaves as expected. The issue is that these forms of comprehensions are only allowed inside
async def
functions. Outside (i.e in the top-level as entered in your REPL), they raise aSyntaxError
as defined.This is stated in the specification section of the PEP, specifically, for asynchronous comprehensions:
Similarly, for using
await
in comprehensions:As for
async loops
, you'll need both an object that conforms to the necessary interface (defines__aiter__
) and placed inside anasync def
function. Again, this is specified in the corresponding PEP: