Я не работал с телеграмом, но безотносительно него(и даже Python) существует множество способов сохранения состояния:
- Глобальные переменные:
button_pressed = False
def press_button():
global button_pressed
if button_pressed:
button_pressed = False
else:
button_pressed = True
press_button()
button_pressed # True
press_button()
button_pressed() # False
- Атрибуты функций:
def press_button():
if hasattr(press_button, 'pressed'):
press_button.pressed = not press_button.pressed
else:
press_button.pressed = True
return press_button.pressed
press_button() # True
# Значение атрибута доступно через dot-notation
press_button.pressed # True
press_button() # False
- Изменяемые аргументы по умолчанию:
def press_button(*, _pressed=[False]):
_pressed[0] = not _pressed[0]
return _pressed[0]
press_button() # True
press_button() # False
- Замыкания:
def button_factory():
pressed = False
def press_button():
nonlocal pressed
pressed = not pressed
return pressed
return press_button
button = button_factory()
button() # True
button() # False
- Самый очевидный это классы:
class Button:
def __init__(self):
self._pressed = False
def __call__(self):
return self._press()
def _press(self):
self._pressed = not self._pressed
return self._pressed
button = Button()
button() # True
button() # False
- etc...
Буду рад если мой вопрос поправит/дополнит реальными примерами кто-то более разумный.
UPD: Привел тривиальные примеры, так как мой ответ неожиданно показался автору полезным.(CAUTION: возможно это жуткий говнокод - тк программист из меня такой-же.)