Пишет что использует переменную перед ее объявлением хотя я использую после
Возникла проблема выдает что я использую переменную перед присваиванием:
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(...
Возможно, во втором, работающем коде у вас так и сделано, просто у вас это не попало в процитированный фрагмент.