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 a SyntaxError as defined.
This is stated in the specification section of the PEP, specifically, for asynchronous comprehensions:
Asynchronous comprehensions are only allowed inside an
async deffunction.
Similarly, for using await in comprehensions:
This is only valid in
async deffunction body.
As for async loops, you'll need both an object that conforms to the necessary interface (defines __aiter__) and placed inside an async def function. Again, this is specified in the corresponding PEP:
It is a
TypeErrorto pass a regular iterable without__aiter__method toasync for. It is aSyntaxErrorto useasync foroutside of anasync deffunction.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With