.get() python json 文件不和谐机器人

.get() python json file discord bot

我有一个 json 文件,用于存储在我的服务器上写入的用户的 ID、XP 和级别。 我正在制作排行榜以显示在我的服务器上拥有最多 xp 的人, 但是会出现键盘错误: KeyError: '370034734186758173'

有人可以帮我解决这个错误吗?

所以马上你的朋友可能指的是你可以做这样的事情: lb = list(map(lambda m: (m, users.get(m.id, {'xp': 0}).get('xp')), message.server.members)]

但至于为什么会这样,您应该先阅读文档:https://docs.python.org/2/library/stdtypes.html#dict.get

但我认为您可能更喜欢对您正在做的事情进行列表理解: https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

例如,您可以像这样重写获取 lb 变量的方式:

lb = [(member, users[member.id].get('xp')) for member in message.server.members if member.id in users]

相当于这样写:

lb = []
for member in message.server.members:
    # Check if the member is in your users list
    if member.id in users: 
        lb.append((member, users[member.id].get('xp')))

访问 users 词典时将使用 .get。您可以将第二个参数作为默认值添加到调用中(以防您找不到这样的键),在第一次调用中您应该输出一个空字典,这样第二个 .get 就不会失败.

lb = list(map(lambda m: (m, users.get(m.id, {}).get("xp"), message.server.members))

既然你正在用它制作一个列表,你可能还想尝试(更像 pythonic 的)列表理解(并不是说你的行有任何问题):

lb = [ (m, users.get(m.id, {}).get("xp") for m in message.server.members ]

请注意,当 get 在字典中找不到键时,这两种方法都会 return 一个 None 项,您可以使用列表中的 if 子句省略它理解:

lb = [ (m, users.get(m.id, {}).get("xp") for m in message.server.members if m.id in users ]

作为旁注,我要补充一点,您已将所有内容都包含在上下文管理器子句 (with open():) 中,而只有加载其内容的行是必需的。最好取消其余代码的缩进。