Методи асинхронного генератора-ітератора

Оновлено: 24.04.2023

У цьому підрозділі описано методи ітератора асинхронного генератора, які використовуються для керування виконанням функції генератора.

coroutine agen.__anext__() Повертає awaitable, який під час запуску починає виконувати асинхронний генератор або відновлює його після останнього виконаного виразу yield. Коли функцію асинхронного генератора відновлено за допомогою методу __anext__(), поточний вираз yield завжди обчислюється як None у поверненому очікуваному, який під час виконання продовжиться до наступного виразу yield. Значення expression_list виразу yield є значенням винятку StopIteration, викликаного завершальною співпрограмою. Якщо асинхронний генератор завершує роботу, не видаючи іншого значення, awaitable натомість викликає виняток StopAsyncIteration, сигналізуючи, що асинхронну ітерацію завершено. Цей метод зазвичай викликається неявно циклом async for.

coroutine agen.asend(value) Повертає awaitable, який після запуску відновлює виконання асинхронного генератора. Як і у випадку з методом send() для генератора, це «надсилає» значення у функцію асинхронного генератора, а аргумент value стає результатом поточного виразу yield. Awaitable, повернений методом asend(), поверне наступне значення, отримане генератором, як значення підвищеної StopIteration, або підвищить StopAsyncIteration, якщо асинхронний генератор завершує роботу, не даючи іншого. значення. Коли asend() викликається для запуску асинхронного генератора, його потрібно викликати з None як аргументом, оскільки немає виразу yield, який міг би отримати значення.

coroutine agen.athrow(type[, value[, traceback]]) Повертає awaitable, який викликає виняток типу type у точці, де асинхронний генератор було призупинено, і повертає наступне значення, отримане функцією генератора як значення викликаного винятку StopIteration. Якщо асинхронний генератор завершує роботу, не видаючи іншого значення, очікуваний виклик викликає виняток StopAsyncIteration. Якщо функція генератора не перехоплює переданий виняток або викликає інший виняток, тоді, коли виконується очікуваний, цей виняток поширюється на виклик очікуваного.

coroutine agen.aclose() Повертає awaitable, який під час виконання видає GeneratorExit у функцію асинхронного генератора в точці, де її було призупинено. Якщо функція асинхронного генератора завершує роботу належним чином, уже закрита або викликає GeneratorExit (не перехоплюючи виняток), тоді повернутий awaitable викличе виняток StopIteration. Будь-які подальші очікування, повернуті наступними викликами асинхронного генератора, викличуть виняток StopAsyncIteration. Якщо асинхронний генератор видає значення, awaitable викликає RuntimeError. Якщо асинхронний генератор викликає будь-який інший виняток, він поширюється на виклик очікуваного. Якщо асинхронний генератор уже завершив роботу через виняток або звичайний вихід, тоді подальші виклики aclose() повернуть очікуваний, який нічого не робить.