2016-12-24 2 views
3

Я пытаюсь использовать Python 3.6's async comprehensions в MacOS Sierra (10.12.2), но я получаю 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.

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 "<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 
>>> 

ответ

6

Это ведет себя, как и ожидался. Дело в том, что эти формы понимания разрешены только внутриasync def функции. Снаружи (т.е. на верхнем уровне, как указано в вашем REPL), они поднимают SyntaxError, как определено.

Об этом сказан в разделе спецификации на PEP, в частности, for asynchronous comprehensions:

Асинхронных постижения разрешены только внутри async def функций.

Аналогично, для использования await in comprehensions:

Это справедливо только в async def теле функции.

Что касается async loops, вам нужен как объект, который соответствует необходимому интерфейсу (определяет __aiter__) и помещаются внутри async def функции. Опять же, это указано в соответствующем PEP:

Это TypeError пройти регулярный Iterable без __aiter__ метода async for. Это SyntaxError для использования async for вне функции async def.

+0

Есть ли быстрый способ вызвать функцию «async def» из REPL и дождаться ее завершения? – tbodt

+0

@tbodt Я понимаю, что вы спросили ровно 6 месяцев назад, но для кого-то еще интересно, вы можете использовать 'asyncio.get_event_loop(). Run_until_complete (some_async_function())' в REPL для синхронного запуска этой функции. –

Смежные вопросы