Как стать автором
Обновить

Комментарии 6

А зачем генерировать код, если его можно интерпретировать?

Тоже интересует этот вопрос. Почему бы не использовать метапрограммирование в python вместо кодогенерации

Я создал готовое подобное решение ГрафиБот: Графический конструктор телеграм-ботов для 1С https://www.v8-pr.ru/gbc

Достаточно просто нарисовать блок-схему телеграм бота, и он сразу заработает.

Интересная мысль с генерацией python-кода. Так же, мне нравится разделение кастомного кода бизнес логики и описание UI. Единственно, что пока не понятно как оно будет работать в больших ботах со сложной логикой. Сбор всех функций в один класс станет нецелесообразным - лучше разделить их по группам. Кроме того, в ботах есть часто повторяющиеся действия - чекбоксы, выбор из динамического списка вариантов, хранящихся в БД, что сразу просится для унификации. Было бы интересно посмотреть, что из этого выйдет.

У меня есть проект, тоже позволяющий описывать UI декларативно, но я не стал пока выносить это в YAML, а предлагаю описывать в виде python-кода (хотя ребята показывали как они генерируют мои объекты из yaml). И тут уже есть свобода создания кастомных компонентов, наследования для внедрения своей логики и т.п. Велкам на гитхаб: https://github.com/Tishka17/aiogram_dialog/. И вот поверх этого уже можно генерировать превью, диаграмму переходов (с определенными ограничениями). Простенькое демо нескольких фич доступно тут: https://t.me/aiogram_dialog_demo_bot (код демо).

Условно у меня это выглядит вот так:

Dialog(
    Window(
        Const("Greetings! Please, introduce yourself:"),
        StaticMedia(
            path=os.path.join(static_dir, "python_logo.png"),
            type=ContentType.PHOTO,
        ),
        MessageInput(name_handler, content_types=[ContentType.TEXT]),
        MessageInput(other_type_handler),
        state=DialogSG.greeting,
    ),
    Window(
        Format("{name}! How old are you?"),  # dynamic text
        Select(  # dynamic buttons list
            Format("{item}"),
            items="ages",  # retrieved from getter function
            item_id_getter=lambda x: x.id,
            id="w_age",
            on_click=on_age_changed,
        ),
        state=DialogSG.age,
        getter=get_data,
    ),
)

Если только как опенсорс. Так что встречал коммерческие решения, где ты просто драг'н'дропом накидывает флоу.

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации