如何使用异步理解?

时间:2016-12-24 22:33:09

标签: python python-3.x asynchronous async-await python-3.6

我试图在MacOS Sierra(10.12.2)中使用Python 3.6's async comprehensions,但我收到了SyntaxError

以下是我尝试过的代码:

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]

我收到async loops语法错误:

result = []
async for i in aiter():
if i % 2:
    result.append(i)

所有代码都是从PEP复制/粘贴的。

终端输出:

>>> 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 个答案:

答案 0 :(得分:6)

这表现得如预期。问题是这些形式的理解只允许 async def函数中。在外部(即在REPL中输入的顶级),他们按照定义提出SyntaxError

这在PEP的规范部分中有说明,具体而言,for asynchronous comprehensions

  

异步理解仅允许在async def函数中。

同样,使用await in comprehensions

  

这仅在async def函数体中有效

对于async loops,您需要一个符合必要接口(定义{{​​1}})并放在__aiter__函数内的对象。同样,这在相应的PEP中指定:

  

async def将没有TypeError方法的常规可迭代项传递给__aiter__。在async for函数之外使用SyntaxErrorasync for