6

我正在尝试在 MacOS Sierra (10.12.2) 中使用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
>>> 
4

1 回答 1

7

这表现如预期。问题是这些形式的推导只允许 async def函数内部。在外部(即在您的 REPL 中输入的顶层),它们SyntaxError按照定义提出 a 。

这在 PEP 的规范部分中有说明,特别是对于异步理解

异步推导只允许在async def函数内部。

同样,对于使用awaitin comprehensions

这仅async def函数体中有效。

至于async loops,您既需要一个符合必要接口(定义__aiter__)的对象,又需要一个放在async def函数中的对象。同样,这是在相应的 PEP 中指定的:

将一个没有方法TypeError的常规迭代传递给. 它是在函数之外使用的。__aiter__async forSyntaxErrorasync forasync def

于 2016-12-24T22:36:34.930 回答