Выход из синтаксиса устанавливает прямую связь между вызывающим объектом и субгенератор, позволяющий беспрепятственно передавать данные между ними. В отличие от традиционных циклов for, которые могут возвращать только значения, выход из обеспечивает двунаправленный канал. Это аналогично установлению временного соединения между клиентскими сокетами, позволяющего как получать, так и отправлять данные.
def reader():
"Simulates reading data from a source"
for i in range(4):
yield f"Используя выход из, мы можем перебирать генератор считывателей без ручной обработки цикла.
Пример: отправка данных в сопрограмму
def writer():
"Simulates writing data to a destination"
while True:
w = (yield)
print(f">>> {w}")
writer_wrapper = writer_wrapper(writer())
for i in range(4):
wrap.send(i) # Output: >>> 0, >>> 1, >>> 2, >>> 3
В этом примере выход из синтаксиса позволяет функции-оболочке отправлять данные в сопрограмма write(), устанавливающая прямой обмен данными.
Обработка исключений
Yield from также прозрачно обрабатывает распространение ошибок. Если подгенератор обнаруживает исключение, оно может быть либо повторно вызвано вызывающей стороной, либо обработано внутри подгенератора.
Пример: обработка исключений с помощью SpamException
class SpamException(Exception):
pass
def writer():
while True:
try:
w = (yield)
except SpamException:
print("***")
else:
print(f">>> {w}")
writer_wrapper = writer_wrapper(writer())
# Raising an exception within the wrapper
wrap.throw(SpamException)
# Expected Output: ***
Yield from гарантирует плавное распространение исключений без необходимости ручной обработки исключений в функции-оболочке.
Заключение
Yield from is мощный синтаксис, который упрощает реализацию двунаправленного обмена данными между вызывающей стороной и подгенераторами, плавно обрабатывая исключения. Он обеспечивает прозрачный и эффективный способ взаимодействия между этими компонентами, что делает его ценным инструментом для решения сложных сценариев обработки данных в Python 3.3 и более поздних версиях.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3