0

リストと辞書を含むネストされたjsonオブジェクトがあります..内部のすべての「foo」キーを検索したいと思います。再帰ジェネレーターを実行しようとしていますが、関数が parse の 2 回目の呼び出しで失敗する理由はわかりません。「in」出力が 1 回しか表示されません。インタプリタが parse に 2 度目に入らないように見えます。どこが間違っているかを理解するのを手伝ってください。

def parse(d,key):
    print('in')
    if type(d)==type({}):
        if key in d:
            yield d[key]
        for k in d:
            parse(d[k],key)
    if type(d)==type([]):
        for i in d:
            parse(i,key)
4

1 に答える 1

5

ジェネレーターは、コルーチンのようには機能しません。ジェネレーター関数がそれ自体を再帰的に呼び出す場合、再帰呼び出しは別のジェネレーター オブジェクトを生成します。コントロールは、Lua などの場合のようにジェネレーター コードに再入力しません。またyield、ジェネレーター呼び出しのスタック全体を一度に中断することもありません。返されたジェネレーター オブジェクトを反復処理し、その要素を生成する必要があります。

def parse(d,key):
    print('in')
    if type(d)==type({}):
        if key in d:
            yield d[key]
        for k in d:
            for item in parse(d[k],key):
                yield item
    if type(d)==type([]):
        for i in d:
            for item in parse(i,key):
                yield item

Python 3.3 では、yield fromサブジェネレーターに委譲するための構文が追加されたため、コードは次のようになります。

def parse(d,key):
    print('in')
    if type(d)==type({}):
        if key in d:
            yield d[key]
        for k in d:
            yield from parse(d[k],key)
    if type(d)==type([]):
        for i in d:
            yield from parse(i,key)

sendこれには、 、throw、およびサブジェネレーターを明示的にループすることでは対処できない一連のエッジ ケースを自動的に処理できるという利点があります。

于 2013-09-12T00:56:32.383 に答える