Как правильно вынести код в отдельную функцию?

Рейтинг: 0Ответов: 1Опубликовано: 15.01.2023

Делаю тг бота и чтобы код не повторялся, вынес его в отдельную функцию. Работает правильно, но тг бот возвращает только одну карточку(значение). Происходит это потому что return выходит из цикла, но как это решит по другому я немного не понимаю

tg_bot.py

def create_card(json_file):

for index, i in enumerate(json_file):
    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

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

    CPU()

    with open('CPU_citilink5%.json') as file:
        data = json.load(file)
        card = create_card(data)
        await message.answer(card)

Немного о проекте: тг бот на основе парсера, который собирает данные с ситилинка

Ответы

▲ 0Принят

Если вы используете оператор return внутри цикла, он выйдет из цикла после первой итерации и вернет только первую карту. Чтобы вернуть все карты, вы можете использовать структуру данных списка для хранения карт, а затем вернуть список после завершения цикла.

Одним из возможных решений было бы инициализировать пустой список перед циклом, добавить каждую карту в список внутри цикла, а затем вернуть список после завершения цикла:

def create_card(json_file):
cards = []
for index, i in enumerate(json_file):
    card = f'{hbold(i.get("name"))}\n' \
           f'{hbold(i.get("price") + " ₽")}\n' \
           f'{i.get("link")}'
    cards.append(card)
return cards

Затем вы можете вызвать функцию в своей функции результата и перебрать возвращенный список карточек, чтобы отправить их в виде сообщений:

    cards = create_card(data)
for card in cards:
    await message.answer(card)

Таким образом, функция перебирает все карточки в json-файле и сохраняет их в списке. Затем бот перебирает список и отправляет каждую карточку в виде сообщения.