«Ошибка типа: не хэшируемый тип: ‘set'» для бота python discord

#python

#python

Вопрос:

Я создаю бота discord с использованием python и его надписи «TypeError: unhashable type: ‘set'». Я не могу понять, почему :/

 def withdraw(person,amount,ininventory,allmoney):
  amount = int(amount)
  if person in allmoney.keys():
    if allmoney[person] > amount:
      if person in ininventory.keys():
        ininventory[person]  = amount
        allmoney[person] -= amount
      else:
        ininventory[person] = 0
        ininventory[person]  = amount
        allmoney[person] -= amount
      return ininventory[person],allmoney[person],allmoney,ininventory
    else:
      moneynow = allmoney[person]
      allmoney[person] = 0
      return ininventory[person],moneynow,allmoney,ininventory
  else:
    ininventory[person] = 0
    return 0,allmoney[person],allmoney,ininventory
 

«если человек в allmoney.keys():» это то, что он говорит «Ошибка типа: нехешируемый тип: ‘set'» для

и это то, что вызывает функцию.

 allmoney = {}
ininventory = {}
@client.command()
async def withdraw(ctx, arg):
  global allmoney
  global ininventory
  amountpocket = "broken"
  amountbank = "broken"
  amountpocket,amountbank,allmoney,ininventory = bank.withdraw({ctx.author.name},arg,allmoney,ininventory)
  await ctx.send(f'withdrawed {arg} Dollars!nYou now have {amountpocket} Dollars in your pocket!nYou now have {amountbank} in your account!')
 

это вызов

 amountpocket,amountbank,allmoney,ininventory = bank.withdraw({ctx.author.name},arg,allmoney,ininventory)
 

Извините, если это неправильный способ задавать вопросы, но я не знаю, как использовать этот вид, и я новичок в этом.

Я думаю, что мой последний вопрос был закрыт.

Комментарии:

1. Почему вы передаете ctx.author.name как set? {'string'} создает экземпляр set в Python, а встроенный тип данных set не имеет требуемого метода для проверки принадлежности к объекту, возвращаемому dict.keys() . Попробуйте просто сделать bank.withdraw(ctx.author.name, ...) вместо этого, удалив фигурные скобки.

2. о, хорошо, я сделаю это

3. он по-прежнему не работает…

4. Даже если это все равно не сработает, это все равно менее неправильно, чем оригинал, который никогда не сможет сработать. Не отклоняйте изменение, которое что- то исправляет, только потому, что оно не исправляет все .

5. Я исправил проблему, но я не знаю, как закрыть тему, поэтому, если модератор может для меня, пожалуйста, сделайте

Ответ №1:

Проверьте тип данных allmoney . Нехешируемый набор типов означает, что вы обрабатываете набор так, как если бы он был словарем. Наборы не имеют ключей, поэтому вызов allmoney.keys() выдаст ошибку. Наборы похожи на массивы, которые содержат только значения.

example_set = {"apple", "orange", "pineapple"}

example_dict = {"fruit": "apple", "vegetable": "lettuce"}