.get () Python JSON файл дискорд бот - PullRequest
0 голосов
/ 08 мая 2018

У меня есть файл json, в котором хранятся идентификаторы, xp и уровень того, кто пишет на моем сервере. Я делаю таблицу лидеров, чтобы показать людям, у которых больше всего опыта на моем сервере, однако появляется ключевая ошибка: KeyError: '370034734186758173'

Может ли кто-нибудь помочь мне исправить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

.get будет использоваться при доступе к словарю users. Вы можете добавить второй параметр к вызову по умолчанию (в случае, если вы не найдете такой ключ), который при первом вызове должен вывести пустой словарь, чтобы второй .get не вышел из строя.

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

Поскольку вы делаете из него список, вы также можете попробовать (несколько более питонное) понимание списка (не то, что в вашей строке что-то не так с ним):

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

Обратите внимание, что оба подхода вернут элемент None, когда get не найдет Ключ в словаре, вы можете пропустить это, используя предложение if в понимании списка:

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

В качестве примечания добавлю, что вы включили все в предложение менеджера контекста (with open():), в то время как необходима только строка, в которую вы загружаете его содержимое. Лучше было бы деиндентировать оставшуюся часть кода.

0 голосов
/ 08 мая 2018

Итак, ваш друг, вероятно, имел в виду тот факт, что вы могли бы сделать что-то вроде этого: 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')))
...