@robocop45
Only python

Как сделать код короче, написанный на aiogram?

@dp.callback_query_handler(text='subchanneldone')  # Что будет выводиться, если человек подписан
async def subchanneldone(message: types.Message):
    await bot.delete_message(message.from_user.id, message.message_id)
    if sub_check_channel(await bot.get_chat_member(chat_id=CHANNEL_ID, user_id=message.from_user.id)):
        keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
        buttons = ["Процессоры", "Видеокарты", "Материнские платы"]
        keyboard.add(*buttons)
        await message.answer('Какие комплектующие вас интересуют?', reply_markup=keyboard)
    else:
        await message.answer(NOT_SUB_MESSAGE, reply_markup=ut.sub_menu)


# начало numbers
# начало процессоры
@dp.message_handler(Text(equals='Процессоры'))
async def get_numbers(message: types.Message):
    num_keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    num_buttons = ['10', '30', '50', 'все']  # сколько карточкек будет показываться
    num_keyboard.add(*num_buttons)
    await message.answer('Сколько карточек хочешь увидеть?', reply_markup=num_keyboard)

    @dp.message_handler(Text(equals='10'))
    async def result(message: types.Message):
        await message.answer('Ищем лучшее для вас')

        CPU()
        count = 0
        with open('CPU_citilink5%.json') as file:
            data = json.load(file)[:10]

        for index, i in enumerate(data):
            card = f'{hbold(i.get("name"))}\n' \
                   f'{hbold(i.get("price") + " ₽")}\n' \
                   f'{i.get("link")}'
            count += 1
            if index % 20 == 0:
                time.sleep(3)

            await message.answer(card)
            print(count)

    @dp.message_handler(Text(equals='30'))
    async def result(message: types.Message):
        await message.answer('Ищем лучшее для вас')

        CPU()
        count = 0
        with open('CPU_citilink5%.json') as file:
            data = json.load(file)[:30]
        for index, i in enumerate(data):
            card = f'{hbold(i.get("name"))}\n' \
                   f'{hbold(i.get("price") + " ₽")}\n' \
                   f'{i.get("link")}'
            count += 1
            if index % 20 == 0:
                time.sleep(3)
            await message.answer(card)
            print(count


Как видите эта часть повторяется очень часто
for index, i in enumerate(data):
            card = f'{hbold(i.get("name"))}\n' \
                   f'{hbold(i.get("price") + " ₽")}\n' \
                   f'{i.get("link")}'
            if index % 20 == 0:
                time.sleep(3)
            await message.answer(card)

Я вынес в отдельную функцию
def create_card(data):
    for index, i in enumerate(data):
        card = f'{hbold(i.get("name"))}\n' \
               f'{hbold(i.get("price") + " ₽")}\n' \
               f'{i.get("link")}'
        if index % 20 == 0:
            time.sleep(3)
        return card


далее таким способом вызвал в handler

@dp.message_handler(Text(equals='10'))
    async def result(message: types.Message):
        await message.answer('Ищем лучшее для вас')

        CPU()
        count = 0
        with open('CPU_citilink5%.json') as file:

            data = json.load(file)[:10]
            card = create_card(data)
            await message.answer(card)
            print(count)


Ошибок нет, но возвращается только одна карточка вместо 10 заявленных. Как сделать так чтобы возвращалось нужное кол-во карточек и сократить код?
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы