How to use Asynchronous Comprehensions?

↘锁芯ラ 提交于 2019-11-30 05:21:43

问题


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
>>> 

回答1:


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 def function.

Similarly, for using await in comprehensions:

This is only valid in async def function 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 TypeError to pass a regular iterable without __aiter__ method to async for. It is a SyntaxError to use async for outside of an async def function.



来源:https://stackoverflow.com/questions/41317309/how-to-use-asynchronous-comprehensions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!