UnboundLocalError: local variable 'lvl' referenced before assignment (global не помогает)

global var

var = ...

это не помогает

  • Пробовал делать так:
@bot.command()
async def rank(ctx, user: discord.Member = None):
    emb = discord.Embed(title='Ранг')
    if user == None:
        user = ctx.message.author
    for row in cursor.execute(f"SELECT xp,lvl FROM userinfo where id={user.id}"):
        xp=row[0]
        lvl = row[1]
        need = (60*1.5)*lvl-(60*0.5)
        emb.add_field(name='Уровень', value=f'{lvl}')
        emb.add_field(name='Опыт', value=f'{xp}')
        emb.add_field(name='Опыта до след. уровня', value=f'{need}')
    await ctx.send(embed=emb)

Но этот вариант отправляет сообщение с заголовком и пустым содержанием.


Код:


@bot.command()
async def rank(ctx, user: discord.Member = None):
    emb = discord.Embed(title='Ранг')
    if user == None:
        user = ctx.message.author
    for row in cursor.execute(f"SELECT xp,lvl FROM userinfo where id={user.id}"):
        xp=row[0]
        lvl = row[1]
        need = (60*1.5)*lvl-(60*0.5)
    emb.add_field(name='Уровень', value=f'{lvl}')
    emb.add_field(name='Опыт', value=f'{xp}')
    emb.add_field(name='Опыта до след. уровня', value=f'{need}')
    await ctx.send(embed=emb)

Полная ошибка:


Ignoring exception in command rank:
Traceback (most recent call last):
  File "E:\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "E:\bot\bot.py", line 1524, in rank
    emb.add_field(name='Уровень', value=f'{lvl}')
UnboundLocalError: local variable 'lvl' referenced before assignment

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "E:\Python\Python39\lib\site-packages\discord\ext\commands\bot.py", line 902, in invoke
    await ctx.command.invoke(ctx)
  File "E:\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "E:\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: UnboundLocalError: local variable 'lvl' referenced before assignment

Ответы (2 шт):

Автор решения: Alpensin

Такая ситуация будет возникать в случае, когда этот запрос

for row in cursor.execute(f"SELECT xp,lvl FROM userinfo where id={user.id}"):

Не возвращает ни одной строки. Тогда не будет выполняться код в цикле for.

→ Ссылка
Автор решения: vladrunk

А так пробовал?

@bot.command()
async def rank(ctx, user: discord.Member = None):
    emb = discord.Embed(title='Ранг')
    if user == None:
        user = ctx.message.author
    user_info = cursor.execute(f"SELECT xp,lvl FROM userinfo where id={user.id}")
    if user_info:
        xp=user_info[0]
        lvl = user_info[1]
    else:
        # Какие-то первоначальные хар-ки
        xp = 0
        lvl = 1
    need = (60*1.5)*lvl-(60*0.5),
    emb.add_field(name='Уровень', value=f'{lvl}')
    emb.add_field(name='Опыт', value=f'{xp}')
    emb.add_field(name='Опыта до след. уровня', value=f'{need}')
    await ctx.send(embed=emb)
→ Ссылка