Typer: xây dựng công cụ dòng lệnh bằng Python

Bạn viết một script hữu ích và muốn đồng nghiệp dùng được. Thay vì bắt họ sửa biến trong file, hãy biến nó thành lệnh CLI. Typer làm việc đó chỉ từ type hints.

Cài đặt và ví dụ đầu tiên

pip install typer
# chao.py
import typer

def main(ten: str, lan: int = 1, hoa: bool = False):
    # Gửi lời chào.
    loi = f"Xin chào {ten}!"
    if hoa:
        loi = loi.upper()
    for _ in range(lan):
        print(loi)

if __name__ == "__main__":
    typer.run(main)
python chao.py An --lan 3 --hoa
python chao.py --help

Typer đọc type hints để tự sinh tham số, kiểm tra kiểu và viết luôn màn hình --help. Truyền --lan abc sẽ bị báo lỗi rõ ràng thay vì gây crash.

Nhiều lệnh con

import typer

app = typer.Typer(help="Công cụ quản lý người dùng")

@app.command()
def them(ten: str, email: str):
    # Thêm người dùng mới.
    print(f"Đã thêm {ten} <{email}>")

@app.command()
def xoa(ten: str, xac_nhan: bool = typer.Option(False, "--yes", "-y")):
    # Xóa người dùng.
    if not xac_nhan:
        xac_nhan = typer.confirm(f"Xóa {ten}?")
    if xac_nhan:
        print(f"Đã xóa {ten}")

if __name__ == "__main__":
    app()
python quanly.py them An [email protected]
python quanly.py xoa An -y

Mô tả và ràng buộc cho tham số

from pathlib import Path

@app.command()
def nhap(
    tep: Path = typer.Argument(..., exists=True, help="File CSV đầu vào"),
    gioi_han: int = typer.Option(100, "--limit", "-l", min=1, max=10000),
):
    print(f"Đọc {tep}, tối đa {gioi_han} dòng")

Typer tự kiểm tra file có tồn tại và giá trị có nằm trong khoảng cho phép.

Màu sắc và thanh tiến trình

import typer

typer.secho("Thành công!", fg=typer.colors.GREEN, bold=True)
typer.secho("Cảnh báo", fg=typer.colors.YELLOW)

with typer.progressbar(range(100), label="Đang xử lý") as thanh:
    for i in thanh:
        ...

Đóng gói thành lệnh cài được

# pyproject.toml
[project.scripts]
quanly = "quanly:app"

Sau pip install ., người dùng gõ thẳng quanly them An [email protected] ở bất kỳ đâu. Nếu chỉ cần thứ tối giản và không muốn thêm phụ thuộc, argparse trong thư viện chuẩn vẫn là lựa chọn tốt.

Lên đầu trang