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 шт):
Вы пытаетесь использовать переменную 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)