Каким образом избавиться от global в коде телеграмм бота?

Рейтинг: 0Ответов: 1Опубликовано: 28.01.2023

Я только начинаю изучать Python. Пробую написать телеграмм бота с регистрацией, бот запрашивает у пользователя данные и сохраняет их в sql базу данных. Многие пишут, что global лучше не использовать, но я не могу понять как от них избавиться в данном случае

import telebot
import sqlite3

conn = sqlite3.connect('D:\python projects\Bot_registration\db/users.db', check_same_thread=False)
cursor = conn.cursor()

def db_table_val(name: str, surname: str, email: str, password: str):
    cursor.execute('INSERT INTO users (name, surname, email, password) VALUES (?, ?, ?, ?)', (name, surname, email, password))
    conn.commit()

bot = telebot.TeleBot("***")

@bot.message_handler(commands=['start'])
def start_message(message):
    markup = types.InlineKeyboardMarkup(row_width=1)
    item1 = types.InlineKeyboardButton("Регистрация", callback_data='registration')
    markup.add(item1)
    bot.send_message(message.chat.id, "Добро пожаловать! Нажмите кнопку регистрация для начала", reply_markup=markup)

@bot.callback_query_handler(func=lambda call: call.data == 'registration')
def registration(call):
    bot.send_message(call.message.chat.id, 'Введите ваше имя:')
    bot.register_next_step_handler(call.message, get_name)

def get_name(message):
    global name
    name = message.text
    name1 = str(name)
    bot.send_message(message.chat.id, f'Введите вашу фамилию:')
    bot.register_next_step_handler(message, get_surname)

def get_surname(message):
    global surname
    surname = message.text
    surname1 = str(surname)
    bot.send_message(message.chat.id, f'Введите ваш адрес электронной почты:')
    bot.register_next_step_handler(message, get_email)

def get_email(message):
    global email
    email = message.text
    email1 = str(email)
    bot.send_message(message.chat.id, f'Введите ваш пароль:')
    bot.register_next_step_handler(message, get_password)

def get_password(message):
    password = message.text
    db_table_val(name=name , surname=surname , email=email , password=password)
    bot.send_message(message.chat.id, 'Регистрация прошла успешно!')
bot.polling()

Ответы

▲ 0

Рекомендую вам перейти с устаревшего telebot-a на более функциональный aiogram. А в целом вам нужно использовать машину состояний и её память.

from aiogram.dispatcher import FSMContext
from aiogram import types

bot = Bot(token="")
dp = Dispatcher(bot, storage=MemoryStorage()) # важно

@dp.message_handler()
async def test(message: types.Message, state: FSMContext = None):
    await state.update_data(name=message.text) # кладём текст от пользователя лист с данными для конкретного пользователя

@dp.message_handler(Command('show'))
async def showData(message: types.Message, state: FSMContext = None):
    data = await state.get_data()
    await bot.send_message(message.from_user.id, data['name'])

Первая функция когда она будет срабатывать будет для отдельного юзера записывать в память сообщение которое он отправил, а при вводе команды /show будет доставать значение из памяти. Так же используя state.reset_data() вы можете очистить полностью хранилище, рекомендуется это делать.

Подробнее про машину состояний в aiogram тут