我试图在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
>>>
答案 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
函数之外使用SyntaxError
是async for
。