Как избежать использования глобальных переменных при написании бота Telegram

Я пишу бота 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()

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать хранилище данных по ключу.

Простое решение — использовать глобальный dict. Однако использования глобальных переменных лучше избегать, так как вы можете случайно изменить эту переменную где-то, и вы даже не поймете, почему ваш код делает какие-то странные вещи. Может быть, вам следует использовать некоторые БД, например. Редис.

Ответ принят как подходящий

библиотека python-telegram-bot имеет встроенное решение именно для этого. Пожалуйста, проверьте эта вики-страница для получения дополнительной информации.


Отказ от ответственности: в настоящее время я являюсь сопровождающим python-telegram-bot.

Кажется, это решило мою проблему, большое спасибо!

Dennis 07.05.2022 21:47

Другие вопросы по теме