Die Yield From-Syntax stellt eine direkte Verbindung zwischen dem Aufrufer und dem her Subgenerator, der einen nahtlosen Datenfluss zwischen ihnen ermöglicht. Im Gegensatz zu herkömmlichen for-Schleifen, die nur Werte liefern können, stellt yield from einen bidirektionalen Kanal bereit. Dies ist analog zum Aufbau einer temporären Verbindung zwischen Client-Sockets, die sowohl das Empfangen als auch das Senden von Daten ermöglicht.
def reader():
"Simulates reading data from a source"
for i in range(4):
yield f"Durch die Verwendung von yield from können wir über den Reader-Generator iterieren, ohne die Schleife manuell bearbeiten zu müssen.
Beispiel: Senden von Daten an eine Coroutine
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
In diesem Beispiel ermöglicht die Syntax von yield from, dass die Wrapper-Funktion Daten an sendet die write()-Coroutine, die einen direkten Datenaustausch herstellt.
Ausnahmebehandlung
Yield from behandelt auch die Fehlerausbreitung transparent. Wenn der Untergenerator auf eine Ausnahme stößt, kann diese entweder vom Aufrufer erneut ausgelöst oder im Untergenerator behandelt werden.
Beispiel: Ausnahmebehandlung mit 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 stellt sicher, dass Ausnahmen reibungslos weitergegeben werden, ohne dass eine manuelle Ausnahmebehandlung in der Wrapper-Funktion erforderlich ist.
Fazit
Yield from ist eine leistungsstarke Syntax, die die Implementierung des bidirektionalen Datenaustauschs zwischen Aufrufer und Subgeneratoren vereinfacht und Ausnahmen nahtlos behandelt. Es bietet eine transparente und effiziente Möglichkeit zur Kommunikation zwischen diesen Komponenten und ist damit ein wertvolles Werkzeug für den Umgang mit komplexen Datenverarbeitungsszenarien in Python 3.3 und höher.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3