@Gera01
Unity, С# и больше ничего.

В чем проблема с обновлением переменных?

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

Код
import telebot;

r = [0, 0]
isLogin = 0
p = [0, 0]


bot = telebot.TeleBot('api');
@bot.message_handler(content_types = ['text'])


def get_text_messages(message):
    if r[1] == 1:
        code = message.text
        r[1] = 0
    elif r[0] == 1:
        phone = message.text
        r[0] = 0
    elif message.text == "/phone":
        bot.send_message(message.from_user.id, "Пожалуйста введите телефон")
        rcsr(0)
    elif message.text == "/login":
        if p[0] != 0:
            if p[1] != 0:
                isLogin = 1

        if isLogin == 0:
            bot.send_message(message.from_user.id,  message.first_name + " вы не заполнили следующие поля: ")
            if p[0] == 0:
                bot.send_message(message.from_user.id, "Телефон. Пожалуйста введите его (/phone)")
            if p[1] == 0:
                bot.send_message(message.from_user.id, "Код, для авторизации. Пожалуйста введите его (/code)")
        else:
            bot.send_message(message.from_user.id, "Вы почти авторизованы! ")
    elif message.text == "/code":
        bot.send_message(message.from_user.id, "Код для авторизации.")
        rcsr(1)
    else:
        bot.send_message(message.from_user.id, "Для начала работы - авторизируйтесь.  /login")


def updateData():
    global phone;
    global code;
    scr = [phone, code]
    print(scr[1])
    print(scr[0])
    return scr;

def rscr(s):
    global r;
    f = r
    f[s] = 1
    r = f
    return f


if __name__ == '__main__':
    bot.polling(none_stop=True)


Ошибки
2022-06-08 02:27:24,207 (util.py:65 WorkerThread1) ERROR - TeleBot: "UnboundLocalError occurred, args=("local variable 'isLogin' referenced before assignment",)
Traceback (most recent call last):
  File "C:\Users\Яков\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\util.py", line 59, in run
    task(*args, **kwargs)
  File "C:/Users/Яков/PycharmProjects/hackBot/main.py", line 28, in get_text_messages
    if isLogin == 0:
UnboundLocalError: local variable 'isLogin' referenced before assignment
"
Traceback (most recent call last):
  File "C:/Users/Яков/PycharmProjects/hackBot/main.py", line 61, in <module>
    bot.polling(none_stop=True)
  File "C:\Users\Яков\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\__init__.py", line 389, in polling
    self.__threaded_polling(none_stop, interval, timeout)
  File "C:\Users\Яков\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\__init__.py", line 413, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\Яков\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\util.py", line 108, in raise_exceptions
    six.reraise(self.exc_info[0], self.exc_info[1], self.exc_info[2])
  File "C:\Users\Яков\PycharmProjects\pythonProject\venv\lib\site-packages\six.py", line 719, in reraise
    raise value
  File "C:\Users\Яков\PycharmProjects\pythonProject\venv\lib\site-packages\telebot\util.py", line 59, in run
    task(*args, **kwargs)
  File "C:/Users/Яков/PycharmProjects/hackBot/main.py", line 28, in get_text_messages
    if isLogin == 0:
UnboundLocalError: local variable 'isLogin' referenced before assignment
  • Вопрос задан
  • 79 просмотров
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
О какой именно функции идёт речь, их там три.
Впрочем, функция updateData вообще не вызывается, а функция rscr объявлена после функции, из которой вызывается, и не доступна из той функции. Вызовет ошибку not defined. До неё просто дело не дошло. Её надо объявить до той функции, из которой вызывается.

каждый вызов я ее личные переменные приравниваю к общим, изменяю так же

Этого не происходит нигде. Функция updateData не вызывается в принципе.

Что касается собственно ошибки, тут есть тонкость.
С одной стороны, вроде бы функция должна видеть переменную isLogin, объявленную в глобальном пространстве имён.
isLogin = 0
r = 1
def testf():
    print(isLogin)
    
    if isLogin == 0:
        print(1)
testf()

Но ты вроде как объявляешь в области видимости функции другую переменную с тем же именем. И она формально перекрывает глобальную внутри функции.
Но фокус в том, что ты объявляешь локальную переменную после того, как обращаешься к ней. Об этом и ошибка сообщает.

Не, даже не так. Ты объявляешь наличие локальной переменной, но ветка с этим объявлением не выполняется; поэтому она вроде есть; но дело до неё не дошло. Глобальная перекрыта, а до локальной не дошло.
.
isLogin = 0
r = 1
def testf():
    if r == 0:
        isLogin = 1  # тут ты объявляешь внутреннюю переменную, которая перекрывает глобальную. 
    if isLogin == 0:
        print(1)
testf()

Надо так:
r = 1
def testf():
    isLogin = 0
    if r == 0:
        isLogin = 1 
    if isLogin == 0:
        print(1)
testf()

или хотя бы так:
isLogin = 0
r = 1
def testf():
    global isLogin
    if r == 0:
        isLogin = 1
    if isLogin == 0:
        print(1)
testf()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы