Lassen Sie uns sagen, ich habe diese Parser:Ändern Ausbeute von Rückgabewert
parsers = {
".foo": parse_foo,
".bar", parse_bar
}
parse_foo
und parse_bar
sind beide Generatoren, die Zeilen eins nach dem anderen ergeben. Wenn ich eine einzelne Dispatch-Funktion erstellen möchten, würde ich dies tun:
def parse(ext):
yield from parsers[ext]()
Die Ausbeute von Syntax mir Tunnel-Informationen ermöglicht leicht nach oben und unten den Generatoren.
Gibt es eine Möglichkeit, das Tunneln beizubehalten, während die Ertragsergebnisse modifiziert werden?
tun so, während der Tunnel brechen ist einfach:
def parse(ext):
for result in parsers[ext]():
# Add the extension to the result
result.ext = ext
yield result
Aber diese Art und Weise kann ich .send()
oder .throw()
den ganzen Weg an den Parser nicht verwenden.
Der einzige Weg, an den ich denke, ist, indem Sie etwas Hässliches wie try: ... except Exception: ...
tun und die Ausnahmen bestehen, während Sie das gleiche für .send()
tun. Es ist hässlich, chaotisch und fehleranfällig.
Ich denke, Ihre beste Wette wahrscheinlich ein 'passthrough_map' zu implementieren wäre das tut, was' map' tut, während vorbei 'send' und' throw' bis zum Generator du mappst vorbei. IIRC, dieses Recht zu tun ist schwierig, aber Sie müssen es nur einmal richtig machen, und dann können Sie es wiederverwenden, wann immer Sie diese Funktionalität benötigen. – user2357112