Как упростить код python?
Помогите упростить код телеграм бота на пайтоне. Все работает, но если добавить еще хендлеры для других дней недели и в каждом будет группа, то код получится громаднейший
@dp.message_handler(text='ПН')
async def send_text(message: types.Message):
connect = sqlite3.connect('main.db')
cursor = connect.cursor()
cursor.execute('SELECT grup FROM Users WHERE id = ?', (message.from_user.id,))
result = cursor.fetchone()
if result is None:
print('none')
for row in result:
if row == 'СВ-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__PN_n'")
row = cursor.fetchone()
await message.answer(row[0], reply_markup=il_1)
elif row == 'СП-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SP_31__PN_n'")
row = cursor.fetchone()
await message.answer(row[0], reply_markup=il_1)
elif row == 'СА-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SA_31__PN_n'")
row = cursor.fetchone()
await message.answer(row[0], reply_markup=il_1)
connect.close()
@dp.message_handler(text='ВТ')
async def send_text(message: types.Message):
connect = sqlite3.connect('main.db')
cursor = connect.cursor()
cursor.execute('SELECT grup FROM Users WHERE id = ?', (message.from_user.id,))
result = cursor.fetchone()
if result is None:
print('none')
for row in result:
if row == 'СВ-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__VT_n'")
row = cursor.fetchone()
await message.answer(row[0], reply_markup=il_3)
elif row == 'СП-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SP_31__VT_n'")
row = cursor.fetchone()
await message.answer(row[0], reply_markup=il_3)
elif row == 'СА-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SA_31__VT_n'")
row = cursor.fetchone()
await message.answer(row[0], reply_markup=il_3)
connect.close()
@dp.callback_query_handler(text='PN_p')
async def answer(call: CallbackQuery):
connect = sqlite3.connect('main.db')
cursor = connect.cursor()
cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
result = cursor.fetchone()
if result is None:
print('none')
for row in result:
if row == 'СВ-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__PN_p'")
row = cursor.fetchone()
await call.message.answer(row[0], reply_markup=il_2)
@dp.callback_query_handler(text='PN_n')
async def answer(call: CallbackQuery):
connect = sqlite3.connect('main.db')
cursor = connect.cursor()
cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
result = cursor.fetchone()
if result is None:
print('none')
for row in result:
if row == 'СВ-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__PN_n'")
row = cursor.fetchone()
await call.message.answer(row[0], reply_markup=il_1)
@dp.callback_query_handler(text='VT_p')
async def answer(call: CallbackQuery):
connect = sqlite3.connect('main.db')
cursor = connect.cursor()
cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
result = cursor.fetchone()
if result is None:
print('none')
for row in result:
if row == 'СВ-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__VT_p'")
row = cursor.fetchone()
await call.message.answer(row[0], reply_markup=il_4)
@dp.callback_query_handler(text='VT_n')
async def answer(call: CallbackQuery):
connect = sqlite3.connect('main.db')
cursor = connect.cursor()
cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
result = cursor.fetchone()
if result is None:
print('none')
for row in result:
if row == 'СВ-31':
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__VT_n'")
row = cursor.fetchone()
await call.message.answer(row[0], reply_markup=il_3)
Ответы (1 шт):
Автор решения: Lecron
→ Ссылка
Декоратор, это функция. Ее использование через @ — синтаксический сахар. Вы можете поступить так:
async def send_text(message: types.Message):
pass
send_text_handlers = [dp.message_handler(send_text, text=wd) for wd in ('ПН', 'ВТ')]
Работа с группами рефакторится так:
groups = {'СВ-31': 'SV_31', 'СП-31': 'SP_31' }
def fetch_for_group(group_code):
cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = f'{group_code}__PN_n'")
row = cursor.fetchone()
return row[0]
async def send_text(message: types.Message):
...
for row in result:
if row in groups.keys():
info = fetch_for_group(groups[row])
await message.answer(info, reply_markup=il_1)
Аналогично рефакторятся остальные блоки кода.