@MaxMaksimov

Как сделать нормальные глобальные переменные?

Пишу несложного телеграм бота на Python на Aiogram/Pyrogram (pyrogram для юзербота, но по сути тут это неважно).
Как вы понимаете, нужно использовать переменные, однако даже объявив переменную вне методов - при попытке ее вызвать они, по сути, остаются локальными:
# ... опустим момент где методы вызываются и т.д., мы же люди понимающие
testInt = 0

async def editTest():
    testInt = 1

async def readTest():
    print(testInt) # будет выведено 0

В таком варианте проблема такая, о которой я сказал. Я прочитал, что можно ставить global testInt например, и тогда вроде как проблема решена, но в таком случае она вообще полностью глобальная - при использовании бота с другого аккаунта переменные распространяются и на него.
Как сделать так, чтобы переменная была "глобальной", но чтобы она не распространялась за пределы своей сессии?
В теме недавно, может просто я тупой, и это база так то, но хочу это подтвердить тут.
  • Вопрос задан
  • 620 просмотров
Решения вопроса 2
SoreMix
@SoreMix
yellow
Читаем в тему машин состояний, FSM Aiogram: https://docs.aiogram.dev/en/dev-3.x/dispatcher/fin...

Там уже в зависимости от того, для чего нужна переменная. Судя по всему это не должно быть константой, тогда используем БД какую нибудь, если это должна быть переменная, которая может например правиться администратором/другим человеком и оставаться единой для всех.

Если переменная задается на каком-то из этапов ввода ответа пользователя - FSM
Если некое подобие конфига для всех пользователей - БД
Ответ написан
Комментировать
@codingoleg
Если вас не пугает потеря этих данных, например, из-за перезагрузки бота и прочего, то можно сделать глобальную переменную - словарь. Ключом будет id пользователя или чата, а значением - то, что вы хотите сохранить для него.
users = {
    12398767: {'name': 'Vasya'},
    98765467: {'name': 'Lena'}
}

def edit(user_id: int):
    global users
    users[user_id]['name'] = 'Petya'

def read(user_id: int):
    print(users[user_id]['name'])

edit(12398767)
read(12398767)  # Petya
print(users)  # {12398767: {'name': 'Petya'}, 98765467: {'name': 'Lena'}}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Можно в базе завести табличку типа properties и хранить там эту переменную.
Судя по внешнему виду это счетчик событий. Вот пускай там и считает.

Делать это переменной application неудобно потому что приложение может рестартовать.
Из-за балансера, подниматься в двух экземплярах или перегружаться. Вот. А база
в этом мире это некая... ну констатна чтоли.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы