【发布时间】:2016-08-03 14:54:31
【问题描述】:
假设我有这些解析器:
parsers = {
".foo": parse_foo,
".bar", parse_bar
}
parse_foo 和 parse_bar 都是生成行的生成器。如果我想创建一个调度函数,我会这样做:
def parse(ext):
yield from parsers[ext]()
yield from 语法让我可以轻松地在生成器上下传输信息。
有什么方法可以在修改产量结果的同时保持隧道效应?
在破坏隧道的同时这样做很容易:
def parse(ext):
for result in parsers[ext]():
# Add the extension to the result
result.ext = ext
yield result
但是这种方式我不能一直使用.send() 或.throw() 到解析器。
我想到的唯一方法是做一些像try: ... except Exception: ... 这样丑陋的事情并传递异常,同时对.send() 做同样的事情。它丑陋、凌乱且容易出错。
【问题讨论】:
-
我认为你最好的选择可能是实现一个
passthrough_map,它在将send和throw传递给你正在映射的生成器时执行map所做的事情。 IIRC,做到这一点很棘手,但您只需要正确处理一次,然后您可以在需要该功能时重复使用它。
标签: python python-3.x generator yield-from