async for document in client.auto_role.find({}):
if client.auto_role_cache.get(document.get("guildID")):
client.auto_role_cache[document.get("guildID")]["roles"] = {document.get("roleID"): document.get("delay")}
else:
client.auto_role_cache[document.get("guildID")] = {"roles": {document.get("roleID"): document.get("delay")}}
嘿,只是想知道如果guildID是在字典中,(意味著字典中已經有角色)如何在不洗掉舊角色的情況下向其中添加更多角色?上面的代碼塊用新資料替換舊資料。
guildID {roles: {roleID1: delayHere, roleID2: delayHere}
每次要添加新資料時是否都必須覆寫整個字典?或者串列中是否有類似于 .append 的東西?
當然,我不必獲取舊資料,然后每次我想將新內容添加到嵌套 dict 時將其與新資料一起添加?這似乎非常低效?
uj5u.com熱心網友回復:
在您可以存盤多個資料之前,您可能需要重新考慮存盤資料的結構。目前,該roles欄位只是一個重新分配的物件,用于替換舊資料。為了獲得預期的行為,即存盤多個角色,您必須存盤一個物件串列。
所以,有效地
{"roles": {...}}
轉換為類似:
{"roles": [{...}, {...}, ...]}
如您所見,現在您可以在roles欄位下存盤多個角色。按照指定修復檔案結構后,您可以編輯 if 陳述句下的代碼塊,如下所示:
# Create a new role
new_role = {document.get("roleID"): document.get("delay")}
# Append the new role to the list
client.auto_role_cache[document.get("guildID")]["roles"].append(new_role)
編輯:根據對問題所做的編輯,您似乎有不同的roleIDs。在這種情況下,您不需要更改資料的結構。您需要做的就是向roles字典中添加一個新欄位。您可以使用普通的舊索引來使其正常作業。
編輯后的代碼類似于:
# Get the new role ID and delay
role_id = document.get("roleID")
delay = document.get("delay")
# Append the new role to the list
client.auto_role_cache[document.get("guildID")]["roles"][role_id] = delay
在上面的代碼片段中,我們使用構造將role_id欄位設定為新獲取的delay值dictionary[key] = value。
uj5u.com熱心網友回復:
項的鍵dict必須是唯一的,因此您在第二個代碼塊中給出的示例是不可能的。
如果您想在 中存盤多個角色guildID[roles],請將其值設為一個串列,然后您可以根據需要追加或更新該串列。
如果您在特定角色中沒有角色,則此處可確保您創建串列的一個有用功能dict是dict.setdefault:
>>> guildID = {}
>>> guildID
{}
>>> guildID.setdefault("roles", []).append("my_role")
>>> guildID.setdefault("roles", []).append("my_role2")
>>> guildID
{'roles': ['my_role', 'my_role2']}
>>>
編輯:根據問題的更新,您可能想要:
>>> guildID = {}
>>> guildID.setdefault("roles", {})["my_role"] = 123
>>> guildID.setdefault("roles", {})["my_role2"] = 123
>>> guildID
{'roles': {'my_role': 123, 'my_role2': 123}}
這意味著您不必為添加到的第一個角色創建特殊情況,也可以dict roles在guildID.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/312984.html
下一篇:深度復制一個包含指標的物件
