for循环中的Python嵌套屈服

for循环中的Python嵌套屈服,python,Python,我有一个我需要编写的程序,它的工作原理如下: 发送POST请求以获取令牌 使用令牌获取电子商务平台中的所有主要类别 然后我必须向下遍历所有类别并获取所有叶子-这是树中没有任何子类别的最终类别-这也意味着我为每个子类别发送get请求,然后检查它是否返回“叶”==True(这是返回的JSON中的标志) 如果它是一个“叶子”,这是一个最后的动作,对于他们,我必须得到所有必需的参数 子类别可能具有不同的长度-例如,“电子设备>智能手机配件>耳机>无线”=长度4,但“房屋和花园>园艺工具>割草机”=长度3

我有一个我需要编写的程序,它的工作原理如下:

  • 发送POST请求以获取令牌
  • 使用令牌获取电子商务平台中的所有主要类别
  • 然后我必须向下遍历所有类别并获取所有叶子-这是树中没有任何子类别的最终类别-这也意味着我为每个子类别发送get请求,然后检查它是否返回“叶”==True(这是返回的JSON中的标志)
  • 如果它是一个“叶子”,这是一个最后的动作,对于他们,我必须得到所有必需的参数
  • 子类别可能具有不同的长度-例如,“电子设备>智能手机配件>耳机>无线”=长度4,但“房屋和花园>园艺工具>割草机”=长度3
  • 我想把它全部保存在JSON中
  • 这应该扩展到尼斯嵌套JSON,它是所有类别及其子类别的集合。在端点上,也就是最终的子类别上,应该有“参数”:存储所有参数的表

    因此,对我来说(我已经开始认真学习使用Scheme/Racket编程),这似乎是一个递归问题,应该在所有子类别中调用它自己,然后在“叶”中结束,我只是最后一次调用以获取参数并结束递归。我在递归函数的内部使用yield语句而不是for循环返回。。。。。。是的,这是我认为应该起作用的

    def get_all_leaves(category_tree):
    for category in category_tree["categories"]:
        if category["leaf"] == True:
            request_parameters = requests.get("https://api.allegro.pl.allegrosandbox.pl/sale/categories/" + category["id"] + "/parameters",
                                                headers=headers_main_category_tree)
            dict_parameters = json.loads(request_parameters.text)
            yield {"name":category["name"], "id":category["id"], "parameters":dict_parameters["parameters"]}
        else:
            request_id = category["id"]
            next_category_tree = requests.get("https://api.allegro.pl.allegrosandbox.pl/sale/categories?parent.id=" + request_id, 
                                               headers=headers_main_category_tree)
            dict_next_category_tree = json.loads(next_category_tree.text)
    
            yield {"name":category["name"], "id":category["id"], "subcategory":get_all_leaves(dict_next_category_tree)}
    
    结果是:

    And this is result of print(list(get_all_leaves(json_main_category_tree)))
    
    [{{'name': 'Dom i Ogród', 'id': '5', 'subcategory': <generator object get_all_leaves at 0x03F7D6F0>},
    {'name': 'Dziecko', 'id': '11763', 'subcategory': <generator object get_all_leaves at 0x03F7D878>},
    {'name': 'Elektronika', 'id': '42540aec-367a-4e5e-b411-17c09b08e41f', 'subcategory': <generator object get_all_leaves at 0x03F7D808>},
    {'name': 'Firma i usługi', 'id': '4bd97d96-f0ff-46cb-a52c-2992bd972bb1', 'subcategory': <generator object get_all_leaves at 0x03F7DA70>},
    ...
    ...
    ...
    {'name': 'Wyposażenie', 'id': '123', 'subcategory': <generator object get_all_leaves at 0x03FCF760>}]
    
    这是打印的结果(列表(获取所有叶子(json\u主目录树)))
    [{{'name':'domi Ogród','id':'5','subcategory':},
    {'name':'Dziecko','id':'11763','subcategory':},
    {'name':'Elektronika','id':'42540aec-367a-4e5e-b411-17c09b08e41f','subcategory':},
    {'name':'Firma i usługi','id':'4bd97d96-f0ff-46cb-a52c-2992bd972bb1','subcategory':},
    ...
    ...
    ...
    {'name':'Wyposażenie','id':'123','subcategory':}]
    
    也就是说,它以某种方式工作,它看起来像一个递归,但它把生成器放在了一个生成器中?它们并没有自我扩展

    yield {"name":category["name"], "id":category["id"], "subcategory":get_all_leaves(dict_next_category_tree)}
    
    递归调用创建一个生成器对象,该对象存储在生成的dict中

    要获得完全展开的结果,最简单的方法是在此处展开递归调用的结果,因此:

    yield {"name":category["name"], "id":category["id"], "subcategory":list(get_all_leaves(dict_next_category_tree))}
    
    通常,您可以将生成器传递到
    list
    以展开它们,而无需显式循环。之所以有效,是因为
    list
    构造函数需要任何类型的iterable(生成器是什么),并进行迭代并生成迭代项的列表。(另一个示例是
    readlines()
    文件对象的方法是不必要的;您只需以相同的方式将打开的文件对象传递到
    列表中即可。)

    递归调用创建一个生成器对象,该对象存储在生成的dict中

    要获得完全展开的结果,最简单的方法是在此处展开递归调用的结果,因此:

    yield {"name":category["name"], "id":category["id"], "subcategory":list(get_all_leaves(dict_next_category_tree))}
    

    通常,您可以将生成器传递到
    list
    以展开它们,而无需显式循环。之所以有效,是因为
    list
    构造函数需要任何类型的iterable(生成器是什么),并进行迭代并生成迭代项的列表。(另一个示例是
    readlines()
    文件对象的方法是不必要的;您只需以相同的方式将打开的文件对象传递到
    列表中即可。)

    对不起,问题到底是什么?结果是否有问题?我希望此生成器展开并在展开所有内容后得出最终结果。我不知道如何进行。对不起,问题到底是什么?结果是否有问题?我希望此生成器展开并得出最终结果一切都扩展了。我不知道怎么做。非常感谢!嗯,我还有进一步的问题。程序在一段时间后停止执行。我甚至添加了print()语句,以查看发生了什么,一切看起来都很完美。但它仍然只在某一点挂起,只在一个子类别上停止,不继续执行(无错误)。它看起来一点也不像无限循环。你知道可能是什么问题吗?你需要为此提出一个新问题。非常感谢!嗯,我还有进一步的问题。程序在一段时间后停止执行。我甚至添加了print()语句在屈服之前查看发生了什么,一切看起来都很完美。但它仍然只在某一点挂起,只在一个子类别处停止,不继续执行(没有错误)。它看起来根本不像无限循环。你知道可能是什么问题吗?你需要为此提出一个新问题。