for循环中的Python嵌套屈服
我有一个我需要编写的程序,它的工作原理如下:for循环中的Python嵌套屈服,python,Python,我有一个我需要编写的程序,它的工作原理如下: 发送POST请求以获取令牌 使用令牌获取电子商务平台中的所有主要类别 然后我必须向下遍历所有类别并获取所有叶子-这是树中没有任何子类别的最终类别-这也意味着我为每个子类别发送get请求,然后检查它是否返回“叶”==True(这是返回的JSON中的标志) 如果它是一个“叶子”,这是一个最后的动作,对于他们,我必须得到所有必需的参数 子类别可能具有不同的长度-例如,“电子设备>智能手机配件>耳机>无线”=长度4,但“房屋和花园>园艺工具>割草机”=长度3
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()语句在屈服之前查看发生了什么,一切看起来都很完美。但它仍然只在某一点挂起,只在一个子类别处停止,不继续执行(没有错误)。它看起来根本不像无限循环。你知道可能是什么问题吗?你需要为此提出一个新问题。