Как правильно вынести код в отдельную функцию?
Делаю тг бота и чтобы код не повторялся, вынес его в отдельную функцию. Работает правильно, но тг бот возвращает только одну карточку(значение). Происходит это потому что 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)
Немного о проекте: тг бот на основе парсера, который собирает данные с ситилинка
Ответы (1 шт):
Если вы используете оператор 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-файле и сохраняет их в списке. Затем бот перебирает список и отправляет каждую карточку в виде сообщения.