Каждый питонист точно написал в своей жизни хотя бы одно CLI приложение. И наверняка для этого использовался старый добрый модуль argparse - встроенный тул для CLI нужд.
Мне всегда казалось, что argparse какой-то кривой, неинтуитивный, слишком избыточной (заставляя писать новую портянку для каждого нового скрипта, копируя, по большом счету один и тот же набор команд). Но пересесть на простую и комфортную альтернативу не получалось.
Наконец-то нашел тул, который решил запрос. Тестирую либу typer последние пару месяцев и очень доволен - все запросы покрывает. Может, так нравится, потому что typer - родственник FastAPI (есть кто-то, кто не любит этот фреймворк?) и в core контрибьюторах те же люди, или потому что реально вышло удобно и просто. Заонбордился за пару минут.
Посмотреть кучу примеров можно в официальной доке: https://typer.tiangolo.com/#run-the-upgraded-example
Совсем базовый пример может быть таким скриптом
import typer
from pathlib import Path
app = typer.Typer()
@app.command()
def annotate(
book: Path = typer.Argument(..., help="Path to the book file"),
num_jobs: int = typer.Option(1, help="Number of parallel jobs"),
):
print(f'Reading book stored under {book} and processing it with {num_jobs} jobs')
if __name__ == '__main__':
app()
Ну а дальше запускаем как обычно
python3 demo_with_typer.py --helpПолучаем красивый интерфейс как на картинке выше.
По итогу, чтобы добавить CLI режим для своего приложения нужно добавить декоратор над функцией, и аннотировать входные аргументы произвольными пользовательскими типами.
- Пишется все очень интуитивно
- Минимальное количество дублирования кода
- Можно писать произвольные вложенные парсеры, с командами и подкомандами
- Эстетически приятный интерфейс, который превращает даже самую стандартную и скучную оболочку во что-то цветное и футуристичное ⚡️
