[英]Python nested yield in for loop
我有一個需要編寫的程序,它的工作原理是這樣的:
這應該擴展到漂亮的嵌套 JSON ,它是所有類別及其子類別的集合。 在端點上-即最終的子類別應該是“參數”:存儲所有參數的表。
所以對我來說(我已經開始認真學習使用 Scheme/Racket 進行編程),這似乎是一個遞歸問題,應該在所有子類別中調用自己,然后在“葉子”結束,我最后一次調用 GET 參數並結束遞歸。 我在遞歸 function 中使用 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>}]
也就是說,它以某種方式工作,它看起來像一個遞歸,但它把生成器放在生成器中? 他們沒有擴大自己。
yield {"name":category["name"], "id":category["id"], "subcategory":get_all_leaves(dict_next_category_tree)}
遞歸調用創建了一個生成器 object,它存儲在產生的 dict 中。
要獲得完全擴展的結果,最簡單的方法是在此處擴展遞歸調用的結果,因此:
yield {"name":category["name"], "id":category["id"], "subcategory":list(get_all_leaves(dict_next_category_tree))}
通常,您可以將生成器傳遞給list
以擴展它們,而無需顯式循環。 它之所以有效,是因為list
構造函數需要任何類型的可迭代 - 生成器是 - 並進行迭代並構建迭代項的列表。 (另一個例子,文件對象的readlines()
方法是不必要的;您可以將打開的文件 object 傳遞給以相同的方式list
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.