Middle
¿Cuál es el papel de la construcción yield from en Python?
sobes.tech AI
Respuesta de la IA
Конструкция yield from используется для делегирования управления итерации от одного генератора (делегирующего генератора) к другому генератору или итератору (генератору-субгенератору).
Основные особенности yield from:
- Упрощает чтение кода: Заменяет собой более сложную логику обработки подгенератора с явными send и throw.
- Автоматически обрабатывает исключения: Исключения, отправленные в делегирующий генератор, передаются субгенератору.
- Автоматически обрабатывает возвращаемое значение: Значение, возвращенное субгенератором (через
return), становится значением выраженияyield from.
# Пример без yield from (сложнее)
def subgenerator_manual():
yield 1
yield 2
return "Manual result"
def delegator_manual():
sub = subgenerator_manual()
try:
value = next(sub)
while True:
try:
sent = yield value
value = sub.send(sent)
except StopIteration as e:
return e.value
except StopIteration as e:
return e.value
# Пример с yield from (проще)
def subgenerator_yield_from():
yield 10
yield 20
return "Yield from result"
def delegator_yield_from():
result = yield from subgenerator_yield_from()
print(f"Subgenerator returned: {result}") # Отображает значение, возвращенное субгенератором
yield 30
# Использование
g_manual = delegator_manual()
print(list(g_manual))
g_yield_from = delegator_yield_from()
print(list(g_yield_from))
В примере с yield from, основной генератор delegator_yield_from делегирует итерацию subgenerator_yield_from. Когда subgenerator_yield_from завершается с помощью return, возвращаемое значение ("Yield from result") присваивается переменной result в delegator_yield_from.