python递归生成器失败

swe*_*wex 0 python recursion json yield nested-loops

我有嵌套的json对象它包含列表和dicts ..我想在里面搜索所有'foo'键.我正在尝试做递归生成器,但是在解析dunno的第二次调用时函数失败,为什么,我甚至只看到'in'输出一次.看起来翻译不会第二次进入解析等等.帮我理解哪里错了?

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)
Run Code Online (Sandbox Code Playgroud)

use*_*ica 5

生成器不像协同程序那样工作.如果生成器函数以递归方式调用自身,则递归调用将生成另一个生成器对象.Control不会像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
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

这具有自动处理的优势send,throw和一帮边缘的情况下,明确遍历子发生器不处理.