# Функция отображения
async def show_pages(chat_id, page):
...
# тут ты отправляешь сообщение!
sent_message = await bot.send_message(chat_id, text='Выберите страницу:', reply_markup=keyboard)
return sent_message.message_id
# Обработчик кнопок
async def callback_handler(query: types.CallbackQuery):
...
message_id = await show_page(query.message.chat.id, page=current_page) # <-- show_page() отправляет сообщение!
# Редактируем сообщение вместо отправки нового <-- не вместо, а после отправки нового
await bot.edit_message_text(chat_id=query.message.chat.id, message_id=query.message.message_id, text='Выберите страницу:',
reply_markup=InlineKeyboardMarkup()) # <-- сносишь клавиатуру у старого сообщения
try:
from .wtf import stuff
except ImportError:
from wtf import stuff
from __init__ import *
class Parent:
known_children = [] # список классов-потомков Parent
@staticmethod
def register(klass): # декоратор для регистрации классов-потомков
Parent.known_children.append(klass)
return klass
@classmethod
def can_handle(cls, data): # "эй, потомок, ты можешь себя создать из этих данных?"
raise NotImplementedError()
@staticmethod
def make(data): # создаёт экземпляр одного из потомков
for child in Parent.known_children:
if child.can_handle(data): # потомок согласился обработать данные?
return child(data) # вызываем конструктор класса-потомка
else: # относится к for ... in !
raise TypeError(f'Никто не знает, что делать с этим:\n{data!r}')
# тут остальная начинка класса
...
# а это пример потомка
@Parent.register # явная регистрация потомка через декоратор
# так удобнее, потому что так можно создавать промежуточных потомков,
# которые не будут реально использоваться - только в наследовании
class SomeChild(Parent):
@classmethod
def can_handle(cls, data):
return data.get('name', None) == 'SomeChild' # критерий для определения - наш случай или нет?
def __init__(self, data):
self.x = data['x']
self.y = data['y']
c = Parent.make({'name': 'SomeChild', 'x': 42, 'y': 69}) # создаст экземпляр SomeChild
print(c)
try:
Parent.make({'name': 'invalid'}) # потерпит неудачу
except TypeError as err:
print(err)
admin/
. Скорее всего, он ведёт на какую-то админ-панель. Стоит взглянуть.import re
pattern = re.compile(r'^\d+\.\s+') # начало строки, 1+ цифра, точка, 1+ пробел
# re.compile() можно сделать один раз, а потом переиспользовать полученный pattern
text = '1. Салат 1'
result = pattern.sub('', text) # заменяем пустой строкой подходящие под шаблон части text
print(result)
def setting(self):
self.server.check_currency()
...
self.setting()
window1 = Kurz()
, так как приложение уйдёт в рекурсивный вызов self.setting()
и из него уже не вернётся.python3 bot.py
, без activate и прочего, использует системное окружение.# ru.py
def setup(dp):
@dp.message_handler()
async def ru_bot(message: types.Message): # да, эти функции описаны внутри setup()
...
@dp.callback_query_handler()
async def handle_callback_ru(callback_query: types.CallbackQuery):
...
# main.py
dp = ... # создаёшь диспетчер бота
import ru
ru.setup(dp) # регаешь обработчики из ru
... # запускаешь бота
simpleDividers(n)[len(simpleDividers(n))+1]
sets = [set() for _ in range(3)]
for s in sets:
print(id(s))