¿Cómo utilizar las Comprensiones Asíncronas?

Estoy tratando de usar las interpretaciones asíncronas de Python 3.6 en una MacOS Sierra (10.12.2), pero recibo un SyntaxError .

Aquí está el código que he probado:

 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] 

Recibo un error de syntax para los bucles asíncronos :

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

Todo el código es copiar / pegar desde el PEP.

Salida de terminal:

 >>> 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 "", 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 "", line 1 print([i async for i in range(10) if i >> 

Esto se comporta como se espera. El problema es que estas formas de comprensión solo se permiten dentro de las funciones de async def . En el exterior (es decir, en el nivel superior como se ingresó en su REPL), SyntaxError un SyntaxError como se define.

Esto se establece en la sección de especificaciones de la PEP, específicamente, para las comprensiones asíncronas :

Las interpretaciones asíncronas solo se permiten dentro de una función de async def .

Del mismo modo, para utilizar await en las comprensiones :

Esto solo es válido en el cuerpo de la función de async def .

En cuanto a los async loops , necesitará un objeto que se ajuste a la interfaz necesaria (define __aiter__ ) y se coloque dentro de una función de async def . De nuevo, esto se especifica en el PEP correspondiente:

Es un __aiter__ para pasar un iterable regular sin el método __aiter__ al que async for . Es un SyntaxError para usar async for fuera de una función de async def .