Как передать переменную вместе с событием нажатия кнопки в декоратор callback без использования глобальных переменных?

Как передать переменную конкретному пользователю в декоратор обработчика кнопок (callback), чтобы избежать смешения ответов, когда два пользователя одновременно играют в загадки с ботом?
  • 18 апреля 2024 г. 13:40
Ответы на вопрос 2
Для передачи переменной вместе с событием нажатия кнопки в декоратор callback без использования глобальных переменных можно воспользоваться замыканием. Внутри декоратора можно определить функцию, которая будет иметь доступ к этой переменной и передавать её в обработчик события. 

Пример:

```python
def callback_with_variable(variable):
    def decorator(callback):
        def wrapped(*args, **kwargs):
            return callback(variable, *args, **kwargs)
        return wrapped
    return decorator
```

Для передачи переменной конкретному пользователю в декоратор обработчика кнопок можно использовать словарь, где ключами будут идентификаторы пользователей, а значениями будут их соответствующие переменные. При обработке события нажатия кнопки можно проверить идентификатор пользователя и получить соответствующую переменную.

Пример:

```python
user_variables = {}

def button_handler(update, context):
    user_id = update.message.from_user.id
    if user_id not in user_variables:
        user_variables[user_id] = initialize_variable_for_user()

    variable = user_variables[user_id]
    # Обработка события нажатия кнопки с использованием переменной

@callback_query_handler(lambda query: True)
def button_callback_handler(update, context):
    user_id = update.callback_query.from_user.id
    if user_id not in user_variables:
        user_variables[user_id] = initialize_variable_for_user()

    variable = user_variables[user_id]
    # Обработка дополнительных событий кнопок

```

Таким образом, каждый пользователь будет иметь свою собственную переменную, избегая смешения ответов при одновременной игре нескольких пользователей.
сходу можно 2 варианта рассмотреть. 
1. Самое простое, но не самое правильное - глобальную переменную сделать не строкой, а словарем, куда будет записываться соответствие
id пользователя (ключ) и его ответ на загадку (значение). Соответственно можно просто через метод update вставлять ответ для каждого пользователя.

2. зашивать в callback_data номер текущей загадки и потом просто по этому номеру вытаскивать ответ.

второй способ предпочтительнее, т.к. в первом случае после рестарта бота весь процесс у пользователей слетит. Да и не очень хорошо глобальными переменными пользоваться
Похожие вопросы