... result = list (await g (i) for i in range (3))
Это эквивалентно этому коду:
async def ait():
for i in range(3):
v = await g(i)
yield v
result = list(ait())
Где ait
- асинхронный c функция генератора. Вы не можете повторить его с помощью обычного синтаксиса for x in ...
и не можете передать его функциям, которые ожидают синхронного итератора (например, list
).
Аналогично, с синхронным кодом:
a = (i for i in range(3))
a[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable
, где (for ...
) - другой синтаксис для определения синхронного генератора.
... result = [await g(i) for i in range(3)]
Это эквивалентно этот код:
result = []
for i in range(3):
v = await g(i)
result.append(v)
Я согласен с тем, что PEP 530 немного расплывчато об этом и может быть обновлен. Я займусь этим.
Возможно, мы сможем сделать сообщение об ошибке «TypeError: 'async_generator' не повторяется» немного яснее. Приветствуются любые идеи по его улучшению.
Я бы сказал, что первый случай должен либо вести себя как второй, либо вызывать синтаксическую ошибку.
Нет, но мы можем улучшить сообщения об ошибках.