在我的discord机器人小游戏中,这意味着我无法更改user
,因为它是由discord API提供的,玩游戏的人也可以在discord中输入命令,而不在他们的PC上执行python文件。我将用户的数据保存在json文件中,并在需要时将该文件读取到字典中。现在我不必担心KeyError
当我尝试从该字典中读取某些内容时,例如如果我尝试读取player_data[user_id]["quests"]["end"]
但这不会被定义,我在每个命令开始时调用函数setup
,该函数测试用户的数据是否已经保存:
async def setup(user):
global ITEMS
with open("player_data.json", "r") as json_file:
player_data = json.load(json_file)
try:
player = player_data[str(user.id)]
except KeyError:
player_data[str(user.id)] = {}
player_data[str(user.id)]["inventory"] = {}
for item in ITEMS:
player_data[str(user.id)]["inventory"][item] = 0
player_data[str(user.id)]["quests"] = {}
player_data[str(user.id)]["quests"]["completed"] = "0"
player_data[str(user.id)]["quests"]["running"] = False
player_data[str(user.id)]["quests"]["start"] = None
player_data[str(user.id)]["quests"]["end"] = None
player_data[str(user.id)]["quests"]["duration"] = None
player_data[str(user.id)]["trees"] = 2
player_data[str(user.id)]["daily_claim"] = None
with open("player_data.json", "w") as json_file:
json.dump(player_data, json_file)
现在这有一个明显的缺陷:
如果定义了player_data[str(user.id)] = {}
,即使不定义player_data[str(user.id)]["trees"] = 2
,也不会引发KeyError
。解决这个问题的方法是,如果我对字典中的每一个键都使用try:
和except
,但是这不是很干净,所以我的问题是,有更好的方法吗
我尝试过的
听起来好像每次当条目不存在或是空的
dict
时都要初始化player_data[str(user.id)]
如果是这种情况,我建议使用^{} 执行以下操作,如果条目不存在,则返回
None
:结果:
{'inventory': {'item_1': 9999, 'item_2': 0}, 'quests': {'completed': '0', 'running': False, 'start': None, 'end': None, 'duration': None}, 'trees': 9999, 'daily_claim': None}
结果:
{'inventory': {'item_1': 0, 'item_2': 0}, 'quests': {'completed': '0', 'running': False, 'start': None, 'end': None, 'duration': None}, 'trees': 2, 'daily_claim': None}
相关问题 更多 >
编程相关推荐