Ошибка "Discord".Почему мой код не достигает ожидаемого результата? - PullRequest
0 голосов
/ 25 июня 2019

У меня сейчас немного проблем с моим Python Discord Bot.Часть кода, которую я пытаюсь запрограммировать в своем боте, представляет собой простую команду броска кубиков, однако, независимо от того, что я пытаюсь сделать, я не могу понять, как это исправить.

Команда, которую я пытаюсь запрограммировать,"! roll d (количество сторон на кости) (количество игральных костей), которое затем должно возвращать количество бросков костей, указанное с количеством сторон. Например, кто-то, набрав"! roll d20 4 ", должен вернуть что-то по строкамиз "Ваши броски костей были: 13, 6, 18, 3". В настоящее время это код, который у меня есть для этого:

@client.command()
async def roll(ctx, sides, amount):
    try:
        sides = sides.split("d")
        rolls = []
        for number in range(amount):
            result = random.randint(sides[1])
            rolls.append(result)
        rolls = ", ".join(rolls)
        await ctx.send("Your dice rolls were: " + rolls)
    except:
        await ctx.send("Incorrect format for sides of dice (try something like \"!roll d6 1\").")

Когда я запускаю программу, я не получаю ошибок, даже когдапытаясь переместить основной раздел за пределы раздела «try», я не получаю ошибок, но все еще не получаю ожидаемый результат, например:

try:
    sides = sides.split("d")
    check = True
except:
    await ctx.send("Incorrect format for sides of dice (try something like \"!roll d6 1\").")
if check == True:
    blah blah rest of code

1 Ответ

1 голос
/ 25 июня 2019

Я нашел 4 ошибки в вашем коде:

  1. Вы сказали, что не получаете ошибок, потому что вы используете голый except. Что-то простое, как
except Exception as e:
  print(e)

выдаст вам сообщение об ошибке. Если вы хотите больше, вы можете также распечатать трассировку, чтобы точно определить неисправный код.

  1. random.randint принимает 2 аргумента start и end и оба являются int.

    Сейчас вы проезжаете только один, и это даже не int.

    sides[1] выдаст вам строку, даже если строка содержит число, но тип по-прежнему является строкой, поскольку .split возвращает список строк. Например, вы назвали !roll d3 5, тогда sides будет списком ["d", "3"], где sides[1] будет строкой "3"

  2. Ваш rolls будет списком целых чисел, потому что random.randint возвращает int, и вы используете rolls .append(result), таким образом, rolls будет списком целых чисел.

    Так что вы не можете использовать ", ".join(rolls), потому что вы будете соединять целые числа в строку ", "

    Вместо этого вам нужно позвонить ", ".join(str(number) for number in rolls), или вы можете конвертировать каждый вызов добавления в строку сразу.

  3. amount будет передано в виде строки, поэтому вы не можете использовать range(amount) оно должно быть range(int(amount))

Итак, полный код:

async def roll(ctx, sides, amount):
  try:
    sides = int(sides.split("d")[1])
    rolls_list = []
    for number in range(int(amount)):
       # 1 is the minimum number the dice can have
       rolls_list.append(random.randint(1, sides))
    rolls = ", ".join(str(number) for number in rolls_list)
    await ctx.send("Your dice rolls were: " + rolls)
  except Exception as e:
    # You should catch different exceptions for each problem and then handle them
    # Exception is too broad
    print(e)
    await ctx.send("Incorrect format for sides of dice (try something like \"!roll d6 1\").")

Вам также следует проверить наличие некоторых ошибок ввода, например, являются ли целые числа отрицательными ака amount

...