Каким образом избавиться от global в коде?
Имеется простой echo скрипт для общения с ботом. В методах использовал global, чтобы изменить переменные. Подскажите хорошую замену для этой процедуры, чтобы обойтись локальными переменными или может быть чем-то еще. Сколько я не пытался что-либо придумать, ничего не выходит. Опыта маловато пока. Исходный код:
import telebot
from telebot import types
bot = telebot.TeleBot('180*:AA*M')
name = ''
surname = ''
age = 0
@bot.message_handler(content_types=['text'])
def start(message):
if message.text == "/reg":
bot.send_message(message.from_user.id, "What's your name?")
bot.register_next_step_handler(message, get_name)
else:
bot.send_message(message.from_user.id, "Write /reg")
@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
if call.data == "yes":
bot.send_message(call.message.chat.id, "I'm remember this, but this is not exactly")
elif call.data == "no":
bot.send_message(call.message.chat.id, "Mda")
def get_name(message):
global name
name = message.text
bot.send_message(message.from_user.id, "What's your surname?")
bot.register_next_step_handler(message, get_surname)
def get_surname(message):
global surname
surname = message.text
bot.send_message(message.from_user.id, "How old are you?")
bot.register_next_step_handler(message, get_age)
def get_age(message):
global age
while age == 0:
try:
age = int(message.text)
except Exception:
bot.send_message(message.from_user.id, "Numerals please")
keyboard = types.InlineKeyboardMarkup()
key_yes = types.InlineKeyboardButton(text="Yes", callback_data="yes")
keyboard.add(key_yes)
key_no = types.InlineKeyboardButton(text="No", callback_data="no")
keyboard.add(key_no)
question = "You are " + str(age) + " old, your name is " + name + " " + surname + "?"
bot.send_message(message.from_user.id, text=question, reply_markup=keyboard)
bot.polling(none_stop=True, interval=0)
Ответы (1 шт):
Автор решения: Violet
→ Ссылка
Всё гораздо проще, можно передавать из шага в шаг с помощью третьего аргумента:
bot.register_next_step_handler(msg, start_3, message.text)
Пример:
@bot.message_handler(commands=['start'])
def start(message):
msg = bot.send_message(message.chat.id, 'Введите *название организации*', parse_mode='Markdown')
bot.register_next_step_handler(msg, start_2)
def start_2(message):
msg = bot.send_message(message.chat.id, 'Введите *ФИО заявителя*', parse_mode='Markdown')
bot.register_next_step_handler(msg, start_3, message.text)
def start_3(message, company):
last = message.text.split()[0]
first = message.text.split()[1]
middle = message.text.split()[2]
phone_btn = telebot.types.ReplyKeyboardMarkup(True, True)
phone_btn.add(types.KeyboardButton(text='Отправить номер', request_contact=True))
msg = bot.send_message(message.chat.id, 'Нажмите кнопку *Отправить номер* ниже', parse_mode='Markdown',
reply_markup=phone_btn)
bot.register_next_step_handler(msg, start_4, first, last, middle, company)
def start_4(message, first, last, middle, company):
if message.contact is not None:
start_5(message, first, last, middle, company, message.contact.phone_number)
def start_5(message, first, last, middle, company, phone):
bot.send_message(message.chat.id, 'Ваши данные:\n{}\n{} {} {}\n{}'.format(company, last, first, middle, phone),
reply_markup=types.ReplyKeyboardRemove())