UnboundLocalError: локальная переменная msg, на которую ссылается перед назначением. Как это исправить?

Я получаю количество сообщений из файла 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

Я перепробовала все, что могла. Кто-нибудь может мне помочь?

Это не может быть ваш реальный код, потому что он вызывает SyntaxError еще до того, как зайдет так далеко. Пожалуйста, дайте нам минимальный воспроизводимый пример.

abarnert 26.03.2018 23:30
msg1 >= 0: выдаст SyntaxError, поэтому я не уверен, какой код вы здесь на самом деле используете ...
wpercy 26.03.2018 23:31

немного подождать

SpaRk_PWM 26.03.2018 23:32

Проблема в заявлениях if. Поскольку нет оператора else, вы можете пройти через эту часть кода, не назначая msg чему-либо. Честно говоря, похоже, вы слишком много пытаетесь сделать в одном месте. Попробуйте разбить свой код на отдельные функции (и сопрограммы, где это необходимо). Так вам будет легче следить за тем, что вы делаете.

Patrick Haugh 26.03.2018 23:34

@PatrickHaugh Я попробую это

SpaRk_PWM 26.03.2018 23:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
849
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме