ошибка при всех значениях аргументов для pay all command economy bot

#python #python-3.x #discord #discord.py #discord.py-rewrite

#python #python-3.x #Discord #discord.py #discord.py-переписать

Вопрос:

Мой код работает, но когда я включаю команду pay ‘all’, она, похоже, выдает мне ошибку. Я хочу, чтобы бот в основном, когда я говорю ему «.pay @example #0001 all», он выбирает все ‘bal’

МОЙ КОД:

 @client.command(aliases=['send'])
async def pay(ctx, member : discord.Member, amount = None):
    await open_account(ctx.author)
    await open_account(member)
    
    if amount == None:
        await ctx.send('Please enter the amount')
        return

    bal = await update_bank(ctx.author)
   


    amount = int(amount)
    if amount == 'all':     #This
        amount = bal[0]     #Wont work

    if amount>bal[1]:
        await ctx.send('You do not have that much money!')
        return
    if amount<0:
        await ctx.send('Amount must be positive!')
        return

    await update_bank(ctx.author,amount, 'wallet')
    await update_bank(member,-1*amount,'bank') 

    await ctx.send(f'{ctx.author.mention} Payed {amount} coins! How generous!')
 

ОШИБКА:

 discord.ext.commands.errors.CommandInvokeError: Command raised an exception: ValueError: invalid literal for int() with base 10: 'all'
 

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

1. Вы не можете проверить наличие строки после попытки преобразования в int, потому что, если это неверное число, то уже слишком поздно. В любом случае вам нужно будет защититься от исключения, на случай, если пользователь введет какой-либо другой вид мусора.

Ответ №1:

Измените это:

     amount = int(amount)
    if amount == 'all':     #This
        amount = bal[0]     #Wont work
 

К этому:

     if amount == 'all':     #This
        amount = bal[0]     #Wont work
    else:
        try:
            amount = int(amount)
        except ValueError:
            await ctx.send(f'Invalid amount({amount}) Must be "all" or an integer')
            return
            
 

Идея здесь в том, что вы хотите проверить, отправлено ли «все», и если нет, попробуйте преобразовать его в целое число. Если вы не можете выполнить приведение к int(), вы получите ValueError, как вы отметили. Поймайте ошибку ValueError, а затем ответьте сообщением пользователю.

Ответ №2:

Измените это:

 
if amount == None:
    await ctx.send('Please enter the amount')
    return

bal = await update_bank(ctx.author)
   


amount = int(amount)
if amount == 'all':     #This
    amount = bal[0]     #Wont work
 

Для:

 bal = await update_bank(ctx.author)
if amount == 'all':
    amount = bal[0]
else:
    try:
        amount = int(amount)
    except ValueError:
        await ctx.send(f'Invalid amount({amount}) Must be "all" or an integer')
        return

amount = int(amount) #This has to be after we define "amount == 'all'"
 #THE REST OF THE CODE