如何使用异步推导式?

7
我正在尝试在MacOS Sierra(10.12.2)中使用{{link1:Python 3.6的异步推导式}},但我收到了一个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]

我在异步循环处收到语法错误:

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个回答

7
这个表现符合预期。问题在于这些推导方式只允许在async def函数内使用。在外部(即在REPL中输入的顶层),它们会引发一个已定义的SyntaxError
这在PEP的规范部分中有说明,具体来说,在异步推导中:

异步推导仅允许在async def函数内使用。

同样,在推导中使用await时:

只有在async def函数体内才有效。

至于async循环,您需要一个符合必要接口(定义了__aiter__)且位于async def函数内的对象。同样,在相应的PEP中有规定:

将没有__aiter__方法的常规可迭代对象传递给async forTypeError。在async def函数之外使用async forSyntaxError


1
有没有一种快速的方法可以从REPL调用一个async def函数并等待它完成? - tbodt
1
@tbodt 我知道你大约6个月前问过,但是对于其他人来说,你可以在REPL中使用asyncio.get_event_loop().run_until_complete(some_async_function())来同步运行函数。 - Teh JoE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接