Powiedzmy mam te parsery:modyfikując wydajność od za wartość zwracana
parsers = {
".foo": parse_foo,
".bar", parse_bar
}
parse_foo
i parse_bar
są oba generatory, które dają rzędach jeden za drugim. Jeśli chcę, aby utworzyć pojedynczą funkcję wysyłki, chciałbym to zrobić:
def parse(ext):
yield from parsers[ext]()
Wydajność od składni pozwala mi informacji tunelu łatwo w górę iw dół generatorów.
Czy istnieje sposób na utrzymanie tunelowania podczas modyfikowania wyników?
przeciwnym razie podczas rozbijania tunelowanie jest proste:
def parse(ext):
for result in parsers[ext]():
# Add the extension to the result
result.ext = ext
yield result
Ale w ten sposób nie można użyć .send()
lub .throw()
całą drogę do parsera.
Jedyny sposób, w jaki myślę, to robienie czegoś brzydkiego, takiego jak try: ... except Exception: ...
i przekazanie wyjątków w górę, robiąc to samo dla .send()
. Jest brzydki, brudny i podatny na błędy.
myślę najlepiej byłoby prawdopodobnie wdrożyć 'passthrough_map' że robi to, co robi' map' podczas przechodzenia 'send' i' throw' przez generator mapujesz. IIRC, wykonanie tego prawa jest trudne, ale potrzebujesz go tylko raz, a następnie możesz go użyć ponownie, gdy tylko potrzebujesz tej funkcjonalności. – user2357112