Я получаю количество сообщений из файла json, но у меня ошибка ... И я не знаю почему. В этой программе бот должен отправлять информацию об упомянутом участнике. Если я напишу msg = None в начале кода, он не будет отправлять как > messages = 10, он отправит messages = None
ПРОГРАММА
if args[0] == '!in':
await client.delete_message(message)
highclass = None
gm = ""
clan = None
if (roleLeaders in message.author.roles or roleHunter in message.author.roles or roleDeputy in message.author.roles):
for member in message.mentions:
user = member
userjoin = str(user.joined_at)
joinpars= userjoin.split()
join = joinpars[0]
msg1 = user_get_msg(member.id)
time1 = user_get_time(member.id)
s = str(msg1)
last = int(s[-1])
st = str(time1)
stm = time1 // 60
sth = stm // 60
std = sth // 24
if time1 <= 60:
lastt = int(st[-1])
if lastt == 0:
time = '{0} секунд'.format(time1)
if lastt == 1 and not time1 == 11:
time = '{0} секунду'.format(time1)
if ((time1 >= 11 and time1 <= 19) or (lastt >= 5 and lastt <= 9)):
time = '{0} секунд'.format(time1)
if (lastt >= 2 and lastt <= 4) and not (time1 >= 11 and time1 <= 19):
time = '{0} секунды'.format(time1)
if time1 <= 3600 and time1 > 60:
lastt = int(str(stm)[-1])
if lastt == 0:
time = '{0} минут'.format(stm)
if lastt == 1 and not stm == 11:
time = '{0} минуту'.format(stm)
if ((stm >= 11 and stm <= 19) or (lastt >= 5 and lastt <= 9)):
time = '{0} минут'.format(stm)
if (lastt >= 2 and lastt <= 4) and not (stm >= 11 and stm <= 19):
time = '{0} минуты'.format(stm)
if time1 <= 86400 and time1 >3600:
lastt = int(str(sth)[-1])
if lastt == 0:
time = '{0} часов'.format(sth)
if lastt == 1 and not sth == 11:
time = '{0} час'.format(sth)
if ((sth >= 11 and sth <= 19) or (lastt >= 5 and lastt <= 9)):
time = '{0} часов'.format(sth)
if (lastt >= 2 and lastt <= 4) and not (sth >= 11 and sth <= 19):
time = '{0} часа'.format(sth)
if time1 >= 86400:
lastt = int(str(std)[-1])
if lastt == 0:
time = '{0} дней'.format(std)
if lastt == 1 and not std == 11:
time = '{0} день'.format(std)
if ((std >= 11 and std <= 19) or (lastt >= 5 and lastt <= 9)):
time = '{0} дней'.format(std)
if (lastt >= 2 and lastt <= 4) and not (std >= 11 and std <= 19):
time = '{0} дня'.format(std)
if msg1 >= 0:
if last == 0 or msg1 == 0:
msg = '{0} записок'.format(msg1)
if msg1 == 1 or (last == 1 and msg1 >= 21):
msg = '{0} записку'.format(msg1)
if (msg1 >= 2 and msg1 <= 4) or (msg1 >= 22 and msg1 <= 24):
msg = '{0} записки'.format(msg1)
if (last >= 5 and last <= 9):
msg = '{0} записок'.format(msg1)
for role in member.roles:
with open('class.json', 'r') as roleread:
if role.id in roleread.read():
highclass = '<@&{0}>'.format(role.id)
with open('clans.json', 'r') as fp:
if role.id in fp.read():
gm = '> Является участником гильдии <@&{0}>.'.format(role.id)
if roleGM in member.roles:
gm = '> Является **мастером** гильдии <@&{0}>.'.format(role.id)
await asyncio.sleep(0.01)
await client.send_message(message.channel, 'Персонаж {0}:\n'
'> Прибыл в город **{1}**;\n'
'> Принимал участие в жизни города **{2}**;\n'
'> Написал **{3}**;\n'
'> Имеет класс {4};\n'
'{5}'.format(member.mention, join, time, msg, highclass, gm))
ОШИБКА
File "soul.py", line 497, in on_message
'{5}'.format(member.mention, join, time, msg, highclass, gm))
UnboundLocalError: local variable 'msg' referenced before assignment
Я перепробовала все, что могла. Кто-нибудь может мне помочь?
msg1 >= 0: выдаст SyntaxError, поэтому я не уверен, какой код вы здесь на самом деле используете ...
немного подождать
Проблема в заявлениях if. Поскольку нет оператора else, вы можете пройти через эту часть кода, не назначая msg чему-либо. Честно говоря, похоже, вы слишком много пытаетесь сделать в одном месте. Попробуйте разбить свой код на отдельные функции (и сопрограммы, где это необходимо). Так вам будет легче следить за тем, что вы делаете.
@PatrickHaugh Я попробую это






Посмотрите, как вы присваиваете значение msg:
if last == 0 or msg1 == 0:
msg = '{0} some useless tex'.format(msg1)
if msg1 == 1 or (last == 1 and msg1 >= 21):
msg = '{0} some useless tex'.format(msg1)
if (msg1 >= 2 and msg1 <= 4) or (msg1 >= 22 and msg1 <= 24):
msg = '{0} some useless tex'.format(msg1)
if (last >= 5 and last <= 9):
msg = '{0} some useless tex'.format(msg1)
Итак, что произойдет, если, скажем, msg1 - это какое-то значение в диапазоне 10-20 (а последнее не равно 0)? Тогда ни один из этих if не сработает. Таким образом, msg никогда ничего не получит. Но вы все равно попытаетесь использовать его и получите ту ошибку.
Вероятно, вам нужно что-то вроде этого:
if last == 0 or msg1 == 0:
msg = '{0} some useless tex'.format(msg1)
elif msg1 == 1 or (last == 1 and msg1 >= 21):
msg = '{0} some useless tex'.format(msg1)
elif (msg1 >= 2 and msg1 <= 4) or (msg1 >= 22 and msg1 <= 24):
msg = '{0} some useless tex'.format(msg1)
elif (last >= 5 and last <= 9):
msg = '{0} some useless tex'.format(msg1)
else:
msg = '{0} WARNING! UNEXPECTED VALUE!'.format(msg1)
(Обратите внимание, что изменение всех этих if на elif может быть семантически значимым изменением. Если два условия могут быть истинными, ваш исходный код выполнит оба из них, поэтому второе переопределит то, что было сделано первым, но новый код будет только выполните первый. Если это имеет значение, на самом деле это чаще всего то, что вы хотите, но если вы хотите другое поведение, вам может потребоваться переписать или изменить порядок ваших условий.)
Это не может быть ваш реальный код, потому что он вызывает
SyntaxErrorеще до того, как зайдет так далеко. Пожалуйста, дайте нам минимальный воспроизводимый пример.