Это мой первый телеграмм бот на питоне, поэтому некоторые вещи умелым python - разработчикам могут показаться комичными и глупыми.
Суть в следующем:
Бот предназначен для расчета ЗП.
Если запустить бота впервые - код отрабатывается корректно и выдает необходимую инфу. В конце, после всех расчетов, появляется сообщение:
---предыдущий код
msg = bot.send_message(message.from_user.id, 'Для повторного расчета нажми "/start"', reply_markup=cancel)
bot.register_next_step_handler(msg, start)
def start(message):
if message.text == '/start' or message.text == 'В начало':
send_welcome(message)
send_welcome(message) - это функция, которая служит началом цикла работы - приветствие, затем запрос расчетного месяца и оклада у пользователя. Для записи не придумано ничего лучше, чем сделать функцию, в которой с помощью bot.register_next_step_handler() будут попадать значения и присваиваться к переменной.
Однако, если сделан первый расчет и выполнен возврат к началу - бот код отрабатывается ровно до момента, как вводится расчетный месяц и падает с ошибкой:
TypeError: 'int' object is not callable
полный стектрейс:
Traceback (most recent call last):
File "/home/LDAP/novikovale/.local/lib/python3.7/site-packages/telebot/__init__.py", line 694, in __threaded_polling
raise e
File "/home/LDAP/novikovale/.local/lib/python3.7/site-packages/telebot/__init__.py", line 650, in __threaded_polling
self.worker_pool.raise_exceptions()
File "/home/LDAP/novikovale/.local/lib/python3.7/site-packages/telebot/util.py", line 143, in raise_exceptions
raise self.exception_info
File "/home/LDAP/novikovale/.local/lib/python3.7/site-packages/telebot/util.py", line 89, in run
task(*args, **kwargs)
TypeError: 'int' object is not callable
Путем дебага нашла участки кода, которые, как предполагаю инициируют эту ошибку. Возможно, проблема в присвоении к month = целое число, но как это поправить и почему первый запуск отрабатывает. Я прочитала несколько статей и подобных вопросов - но в основном там производятся вычисления и где-то дублится название функции и переменной или утерян арифметический знак.
Буду благодарна знающим людям, если помогут разобраться.
Если не хватает исходного кода - добавлю.
kod---предыдущий код---
# функция выбора месяца
@bot.message_handler(content_type=['text'])
def monthes(message):
# кнопки
m = types.ReplyKeyboardMarkup(resize_keyboard=True)
# проверка работы предыдущей функции
if message.text == 'Аванс' or message.text == 'Зарплата':
m.row('Январь')
m.row('Февраль')
m.row('Март')
m.row('Апрель')
m.row('Май')
m.row('Июнь')
m.row('Июль')
m.row('Август')
m.row('Сентябрь')
m.row('Октябрь')
m.row('Ноябрь')
m.row('Декабрь')
m.row('Назад')
# сообщение пользователю - выбрать месяц
msg = bot.send_message(message.from_user.id, 'Выберите месяц', reply_markup=m)
# для связи функций - принимает в себя сообщение из текущей и говорит о том, что оно будет обработано в следующей функции salary, а также записана в record_m
bot.register_next_step_handler(msg, record_m)
bot.register_next_step_handler(msg, salary)
else:
# если будет отправлено что-то иное - возврат в предыдущее меню
send_welcome(message)
return
# запись ответа (месяц)
def record_m(message):
global month_u
month_u = message.text
month_check()
# нумерация месяцов
def month_check():
global month
if month_u == 'Январь':
month = 1
elif month_u == 'Февраль':
month = 2
elif month_u == 'Март':
month = 3
elif month_u == 'Апрель':
month = 4
elif month_u == 'Май':
month = 5
elif month_u == 'Июнь':
month = 6
elif month_u == 'Июль':
month = 7
elif month_u == 'Август':
month = 8
elif month_u == 'Сентябрь':
month = 9
elif month_u == 'Октябрь':
month = 10
elif month_u == 'Ноябрь':
month = 11
elif month_u == 'Декабрь':
month = 12
return month
---следующий код---