Почему цель не определена - PullRequest
0 голосов
/ 16 июня 2020

Я кодирую экономичного бота Discord с помощью discord.py, но моя команда share не работает:

if message.content.startswith('bott share'):
        try:
            target, amount = message.content.split(' ')[1:]
            amount = int(amount)
        except ValueError:
            await message.channel.send('Invalid Arguments')
        target = target[2:-1]
        if target[0] == '!':
            target = target[1:]
        target = int(target)
        if amount > getcoins(user):
            await message.channel.send('ARE YOU TRYING TO HJACK THE SYSTEM?')
        elif amount < 0:
            await message.channel.send('ARE YOU TRYING TO HJACK THE SYSTEM?')
        setcoins(user, getcoins(user)-amount)
        setcoins(target, getcoins(target)+amount)
        await message.channel.send(f'You gave {target} {amount}, and now you have {getcoins(user)}.')

Когда я запускаю, он говорит:

Ignoring exception in on_message
Traceback (most recent call last):
  File "/home/runner/.local/lib/python3.8/site-packages/discord
/client.py", line 312, in _run_event
    await coro(*args, **kwargs)  File "main.py", line 601, in on_message
    target = target[2:-1]
UnboundLocalError: local variable 'target' referenced before as
signment

1 Ответ

1 голос
/ 16 июня 2020

Когда вы запускаете

 target, amount = message.content.split(' ')[1:]

и возникнет ошибка, он не будет создавать переменные target, amount, но после обнаружения этой ошибки вы запускаете target[2:-1], а затем он пытается получить значение из несуществующей переменной

Вы можете поместить все внутри try /, кроме

if message.content.startswith('bott share'):
    try:
        target, amount = message.content.split(' ')[1:]
        amount = int(amount)
            target = target[2:-1]
        if target[0] == '!':
            target = target[1:]
        target = int(target)
        if amount > getcoins(user):
            await message.channel.send('ARE YOU TRYING TO HJACK THE SYSTEM?')
        elif amount < 0:
            await message.channel.send('ARE YOU TRYING TO HJACK THE SYSTEM?')
        setcoins(user, getcoins(user)-amount)
        setcoins(target, getcoins(target)+amount)
        await message.channel.send(f'You gave {target} {amount}, and now you have {getcoins(user)}.')
    except ValueError:
        await message.channel.send('Invalid Arguments')

, или вы можете установить какое-то значение по умолчанию перед try/except или внутри except

    target = None
    amount = None

    try:
        target, amount = message.content.split(' ')[1:]
        amount = int(amount)
    except ValueError:
        await message.channel.send('Invalid Arguments')

    if target is not None and amount is not None:
       target = target[2:-1]
       # ... rest ...

или в конечном итоге - но если target - пустая строка или amount - 0, то if даст False

    if target and amount:
       target = target[2:-1]
       # ... rest ...

Если вы запустите этот код в функции, вы можете использовать return до финиша sh функция

    try:
        target, amount = message.content.split(' ')[1:]
        amount = int(amount)
    except ValueError:
        await message.channel.send('Invalid Arguments')
        return  # finish function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...