Пишет что использует переменную перед ее объявлением хотя я использую после

Возникла проблема выдает что я использую переменную перед присваиванием:

FATAL:  password authentication failed for user "xzartsust#1254"
]
Ignoring exception in command report:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.9/site-packages/discord/ext/commands/core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "/app/cogs/commands/moderation/report_system/report.py", line 54, in report
if (conn):
UnboundLocalError: local variable 'conn' referenced before assignment

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

Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.9/site-packages/discord/ext/commands/bot.py", line 903, in invoke
await ctx.command.invoke(ctx)
File "/app/.heroku/python/lib/python3.9/site-packages/discord/ext/commands/core.py", line 859, in invoke
 await injected(*ctx.args, **ctx.kwargs)
File "/app/.heroku/python/lib/python3.9/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 'conn' referenced before assignment

Вот сам код:

try:
    conn = psycopg2.connect(
        database = f"{database}", 
        user = f"{user}", 
        password = f"{password}", 
        host = f"{host}", 
        port = "5432"
    )
    
    cursor = conn.cursor()
    
    cursor.execute(f'SELECT report_channel FROM public."myBD" WHERE guild_id = {guild.id};')
    chanel = cursor.fetchone()
    conn.commit()
    
    if chanel[0] is None:
        await ctx.send('Ошибка! У вас не указан канал для репортов. Установить канал вы можете с помощю команди reportchannel', delete_after = 10)
    if reason is None:
        await ctx.send('Укажите, пожалуста, причину репорта!', delete_after = 5)
    elif member is None:
        await ctx.send('Укажите, пожалуйста, пользователя на которого вы хотите пожаловаться!', delete_after = 5)
    else:
        channel = self.bot.get_channel(chanel[0])
        await channel.send(f'Пользователь {member.mention} получил жалобу от {user.mention} по причине: {reason}')           
except Exception as e:
    print(f'[{ctx.message.created_at}] [{ctx.message.guild.name}] [{ctx.message.guild.owner}] - [{e}]')
finally:
    if (conn):
        cursor.close()
        conn.close()

Хотя у меня написан похожий код и там все работает:

try:
    conn = psycopg2.connect(
        database = f"{database}", 
        user = f"{user}", 
        password = f"{password}", 
        host = f"{host}", 
        port = "5432"
        )

        cursor = conn.cursor()
            
        if isinstance(channel, int) is True:
            cursor.execute(f'UPDATE public."myBD" SET report_channel = \'{channel}\' WHERE guild_id = \'{guild.id}\';')
            conn.commit()
            canal = self.bot.get_channel(channel)
            await ctx.send(f'Канала {canal.mention} был установлен для *Репортов*')
        elif channel is None:
            await ctx.send('Ошибка! Укажите айди канала!', delete_after = 5)
        elif isinstance(channel, int) is False:
            await ctx.send('Ошибка! Вы можете указать только айди канала!', delete_after = 5)
   
except Exception as e:
    print(f'[{ctx.message.created_at}] [{ctx.message.guild.name}] [{ctx.message.guild.owner}] - [{e}]')
        
finally:
    if (conn):
    cursor.close()
    conn.close()

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

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

Если ваш код упадёт на psycopg2.connect, то в conn ничего не успеет присвоиться и переменной этой просто не будет существовать.

Попробуйте поменять проверку на такую:

finally:
    if 'conn' in locals():
        if (conn):
            cursor.close()
            conn.close()

Но лучше в начале кода установите conn в None, тогда переменная у вас точно будет и эта проверка уже не нужна:

conn = None
try:
    conn = psycopg2.connect(...

Возможно, во втором, работающем коде у вас так и сделано, просто у вас это не попало в процитированный фрагмент.

→ Ссылка