@aab137

Telethon. Как улучшить способ отправки сообщения и получения ответа?

У меня есть ощущение, как будто я нашел способ укротить автомобиль (о да!), пробив бензобак, приделал палки, впряг лошадь и поехал. Вроде кайф, но что-то не то.

Все дело в том, что я совсем не разбираюсь в async, поэтому сделал как мог. Хочу улучшить, жду советов профессионалов

Задача - отправить сообщения боту и получить ответные сообщения (еще между сообщениями вставить команды для бота, но это не важно)
def get_answer(self, vk_id, msgs, bot_name='aab137'):
    api_id, api_hash = self.get_tg_api(vk_id, session_time=60)
    client = telethon.TelegramClient('tg_sessions/' + str(api_id), api_id, api_hash)
    async def get_answer(self, vk_id, msgs, bot_name):
        await client.delete_dialog(bot_name, revoke=False)
        msgs_number = self.get_msgs_number(vk_id)

        for msg in msgs:
            msgs_number += 1
            cmds_before, cmds_after = self.config.get((msgs_number, 'before')), self.config.get((msgs_number, 'after'))
            if cmds_before:
                for cmd in cmds_before:
                    await client.send_message(bot_name, cmd)
            await client.send_message(bot_name, msg)
            if cmds_after:
                for cmd in cmds_after:
                    await client.send_message(bot_name, cmd)
        time.sleep(5)
        ans = await client.get_messages(bot_name, None, from_user=bot_name)
        ans = [msg.text for msg in ans]
        return ans
    with client:
        ans = client.loop.run_until_complete(get_answer(self, vk_id, msgs, bot_name))
    ans.reverse()
    return ans

Что я сделал неправильно, что можно улучшить?
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
lxstvayne
@lxstvayne
Люблю Python
Вы используете time.sleep(5), этот метод блокирует поток, используйте асинхронный аналог sleep -- await asyncio.sleep(5). Чтобы код читался лучше -- используйте аннотации типов. Также не стоит называть 2 функции одинаково. Можно разбить на большее количество функций и манипулировать только ими, так редактировать код станет гораздо проще. В новых версиях Python предпочтительно использовать f-строки.
Код повторяется:
for cmd in cmds_before:
    await client.send_message(bot_name, cmd)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SpectrumData Екатеринбург
от 150 000 до 200 000 ₽
Гринатом Москва
от 150 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
18 июн. 2024, в 18:04
10000 руб./за проект
18 июн. 2024, в 17:19
5000 руб./за проект