Я пишу бота Telegram на Python, используя библиотеку python-telegram-bot. Функция бота — искать POI в заданном месте. У меня есть ConversationHandler с 8 состояниями, и мне нужно передать некоторые данные между этими функциями, такие как адрес и координаты места, а также радиус поиска. Однако, если я использую глобальные переменные, бот не работает должным образом, когда его используют несколько человек одновременно. Каковы альтернативы введения глобальных переменных?
У меня примерно следующий код:
# ...
def start(update, context):
context.bot.send_photo(update.message.chat_id, "...", caption = "Hello")
return 1
def location(update, context):
global lat, lon, address
address = update.message.text # here i get a variable that i have to use later
lon, lat = get_coordinates(address).split()
keyboard = [
... # an InlineKeyboard
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text("...", reply_markup=reply_markup)
return 2
# ... some other functions ...
def radius(update, context):
global r
r = float(update.message.text) # here i also get a variable that i'll need later
keyboard = [
... # another keyboard
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text("...",
reply_markup=reply_markup)
return 4
def category(update, context):
global lat, lon, r
query = update.callback_query
query.answer()
keyboard = [...]
categories_dict = {
...
}
subcategories = find_subcategories(categories_dict[query.data], lat, lon, r) # here i need to use the variables
...
# ... some other similar functions where i also need those values ...
def main():
updater = Updater(TOKEN)
dp = updater.dispatcher
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states = {
# ... handler states ...
},
fallbacks=[CommandHandler('stop', stop)]
)
dp.add_handler(conv_handler)
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
Вы можете использовать хранилище данных по ключу.
Простое решение — использовать глобальный dict. Однако использования глобальных переменных лучше избегать, так как вы можете случайно изменить эту переменную где-то, и вы даже не поймете, почему ваш код делает какие-то странные вещи. Может быть, вам следует использовать некоторые БД, например. Редис.
библиотека python-telegram-bot
имеет встроенное решение именно для этого. Пожалуйста, проверьте эта вики-страница для получения дополнительной информации.
Отказ от ответственности: в настоящее время я являюсь сопровождающим python-telegram-bot
.
Кажется, это решило мою проблему, большое спасибо!