Python жалуется на переменную, которая якобы не привязана к значению

# -*- coding: utf-8 -*-

import csv
import random

import telebot
from telebot import types

bot = 
telebot.TeleBot('токен не спалю')

code_security = 9223
data = [["", "", "", ""]]
data_user = []

# где-то 60 строчек

print("Бот в работе,  если хотите собрать данные о 
пациентах,зайдите в бота и введите /data")
    def check_and_continue_2(message):
    if message.text == "/start":
        print("Стоп машина, форма сбросилась")
    else:
        data_user.append(message.text)
        msg1 = bot.send_message(message.chat.id, "")
        bot.register_next_step_handler(msg1, check_and_continue_3)

def check_and_continue_3(message):

    if message.text == "/start":
        print("Стоп машина, форма сбросилась")
    else:
        data_user.append(message.text)
        msg1 = bot.send_message(message.chat.id, "")
        bot.register_next_step_handler(msg1, check_and_continue_4)
    
def check_and_continue_4(message):
    if message.text == "/start":
        print("Стоп машина, форма сбросилась")
    else:
        data_user.append(message.text)
        msg1 = bot.send_message(message.chat.id, "")
        bot.register_next_step_handler(msg1, check_and_continue_5)

def check_and_continue_5(message):

    **data_user.append(message.text)**
    data.append(data_user)
    data_user = []

Возникла проблема с переменной data_user (UnboundLocalError: cannot access local variable 'data_user' where it is not associated with a value), которая была создана как пустой список. Я вставил код, где она (переменная) изменялась. Строчка с проблемой выделена. Помогите, горит заказ


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

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

Вы пытаетесь использовать переменную data_user в функции check_and_continue_5, когда она объявлена в теле этой же функции. Язык требует, чтобы переменная была объявлена перед её использованием. Можете сделать переменную data_user глобальной внутри функции или передавать её как параметр в функции, где она используется.

Вариант 1:

def check_and_continue_5(message):
    global data_user
    data_user.append(message.text)
    data.append(data_user)
    data_user = []

Вариант 2:

def check_and_continue_5(message, data_user):
    data_user.append(message.text)
    data.append(data_user)
    data_user = []

При этом во всех вызовах check_and_continue_5 вам нужно будет передавать data_user как аргумент.

Еще можно реализовать объект класса или словарь для хранения данных вместо использования глобальных переменных:

class UserData:
    def __init__(self):
        self.data_user = []

def check_and_continue_2(message, user_data):
    if message.text == "/start":
        print("Стоп машина, форма сбросилась")
    else:
        user_data.data_user.append(message.text)
        msg1 = bot.send_message(message.chat.id, "")
        bot.register_next_step_handler(msg1, check_and_continue_3, user_data)

def check_and_continue_3(message, user_data):
    if message.text == "/start":
        print("Стоп машина, форма сбросилась")
    else:
        user_data.data_user.append(message.text)
        msg1 = bot.send_message(message.chat.id, "")
        bot.register_next_step_handler(msg1, check_and_continue_4, user_data)

def check_and_continue_4(message, user_data):
    if message.text == "/start":
        print("Стоп машина, форма сбросилась")
    else:
        user_data.data_user.append(message.text)
        msg1 = bot.send_message(message.chat.id, "")
        bot.register_next_step_handler(msg1, check_and_continue_5, user_data)

def check_and_continue_5(message, user_data):
    user_data.data_user.append(message.text)
    data.append(user_data.data_user)
    user_data.data_user = []

# Использование:
user_data = UserData()
check_and_continue_2(message, user_data)
→ Ссылка