7

これらのパーサーがあるとしましょう:

parsers = {
    ".foo": parse_foo,
    ".bar", parse_bar
}

parse_fooparse_barはどちらも行を 1 つずつ生成するジェネレータです。単一のディスパッチ関数を作成する場合は、次のようにします。

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()。それは醜く、乱雑で、バグが発生しやすいです。

4

3 に答える 3

0

拡張機能を用意parse_fooしてparse_bar追加します。

def parse_foo(ext):
    # Existing code
    ...
    # Add an extension to the item(s)
    item.ext = ext

def parse(ext):
    yield from parsers[ext](ext)

または、各関数でハードコードするだけです。

def parse_foo():
    # Existing code
    ...
    # Add an extension to the item(s)
    item.ext = ".foo"
于 2016-04-12T20:04:30.600 に答える