Comments 14
Прикольные инструменты, не знал про них. Спасибо за статью.
Часть 2 про Rich задублировалась, исправьте пожалуйста.
Так и не понял, чем это лучше argparse. Та же простыня настроек, только не там, где ты хочешь, а обязательно в main. А argparse тоже умеет валидацию типов и кастомные ограничения.
А у меня есть немного другой запрос - давно уже хочется превратить консоль в аналог терминала GDB: пользователь вводит команды, мы их валидируем и парсим, исполняем, возможно, меняем внутреннее состояние. Желательно, чтобы было какое-то автодополнение, к тому же. С ходу ничего не нашёл, руками заифал сплиты input() в цикле... Может, кто-нибудь сталкивался с такой штукой?
Статья хорошая! Однозначно в закладки. Жду решения той же задачи для GUI...просим!!!
превращая скучный текстовый поток в информативный и приятный для глаз интерфейс.
Unpopular opinion, но я здесь вижу "превращая универсальный и работающий везде текст в раздутое и постоянно ломающееся месиво из юникода". Регулярно у меня ломаются и цвета, и эмодзи, и особенно рамочки в самых разных местах: в контейнерах, в термуксе, во встроенном терминале IDE. Красота — это, конечно, хорошо, но максимум, что можно сделать — подкрасить особенно важные места вывода и добавить что-то вроде галочек и крестиков (только там, где оно несёт реальную смысловую нагрузку и предварительно протестировав на разных терминалах). И нужно помнить ещё и о том, что в куче мест может не быть цветов, поэтому не нужно на них одних вешать ответственность за передачу смысловой нагрузки (иной раз прогрессбары делают одинаковыми символами разных цветов, а потом сидишь в одноцветном терминале и думаешь, чего ж оно не грузится). Ну а таблички уже полвека замечательно рисуются символами табуляции.
еще есть click, тоже вполне удобная обработка аргументов
import click
@click.command()
@click.option("--name", "-n", prompt="Your name", help="The person to greet.")
@click.option("--count", "-c", default=1, help="Number of greetings.")
def hello(name, count):
"""Simple program that greets NAME for a total of COUNT times."""
for x in range(count):
click.echo(f"Hello {name}!")
if __name__ == "__main__":
hello()или если надо не просто агрументы а команды с аргументами, тогда вот так
import click
@click.group()
def cli():
pass
@cli.command()
@click.option("--name", prompt="Your name", help="The person to greet.")
@click.option("--count", default=1, help="Number of greetings.")
def hello(name, count):
"""A command that greets NAME for a total of COUNT times."""
for x in range(count):
click.echo(f"Hello {name}!")
@cli.command()
@click.option("--name", prompt="Your name", help="The person to greet.")
def bye(name):
"""A command that says goodbye to NAME."""
click.echo(f"Goodbye {name}!")
if __name__ == "__main__":
cli()
вызов без аргументов выдает короткую справку
Usage: click_demo.py [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
bye A command that says goodbye to NAME.
hello A command that greets NAME for a total of COUNT times.вызов помощи для команды, показывает описание команды
$click_demo.py hello --help
Usage: click_demo.py hello [OPTIONS]
A command that greets NAME for a total of COUNT times.
Options:
--name TEXT The person to greet.
--count INTEGER Number of greetings.
--help Show this message and exit.А поверх click'а можно воткнуть Trogon и одним декоратором сконвертировать CLI-приложение в удобный TUI (текстовый GUI), с дропдаунами, валидаторами и т.п., который к тому же обратно совместим с консольным вызовом, т.е. можно вызывать в "консольном" виде, или в виде интерактивного интерфейса.
Тайпер и есть обёртка над кликом. Ничего нового не несёт, кроме способа описывать аргументы.
К Сlick претензий нет, пользуюсь, удобно. Есть группы, вложенная структура команд, опции, флаги, аргументы и т.п. + расширения вида click_log и указанного ниже Trogon и м.б. что еще.
С самых первых строк нам рассказывают про боль использования CLI приложений. Чтобы такую боль не испытывать пару лет назад сделал фреймворк и менеджер утилит на базе PySide6 (в профиле есть статьи об этом). В Qt много стандартных виджетов для отображения информации, есть программа для дизайна окон, так что можно собрать утилиту почти с той же скоростью, что и без gui
Создаем красивые и удобные CLI-приложения на Python с помощью Typer и Rich