Python講座 / argparseでコマンドラインプログラムを作る

argparseはコマンドラインの引数、変換、既定値、選択肢を定義し、ヘルプや入力エラーを生成します。引数の解析と計算を分けると、計算部分を別の画面やテストからも利用できます。

位置引数とオプションを使い分ける

位置引数は指定した順序に対応し、--currencyのようなオプションは名前で指定します。nargs="+"は一つ以上の値を要求し、typeは変換関数、choicesは許可する候補を設定します。

コマンドの引数はシェル履歴やプロセス一覧に見える場合があります。パスワードやトークンは別の適切な入力・秘密管理の方法で扱います。空白を含むパスは引用符で囲み、一つの引数として渡してください。

戻り値とサブコマンドの構成は、関数を定義し、戻り値を返すで扱う規則とつながります。

合計コマンドの全体を実行する

sum_cli.pyを保存し、仮想環境でpython sum_cli.py 3500 8000 2500を実行します。

import argparse

def nonnegative(text):
    try:
        value = int(text)
    except ValueError as error:
        raise argparse.ArgumentTypeError("expected an integer") from error
    if value < 0:
        raise argparse.ArgumentTypeError("expected a nonnegative amount")
    return value

def main():
    parser = argparse.ArgumentParser(description="Sum expense amounts")
    parser.add_argument("amounts", type=nonnegative, nargs="+")
    parser.add_argument("--currency", choices=["KRW", "USD"], default="KRW", help="Output unit label; no currency conversion")
    args = parser.parse_args()
    print(f"{sum(args.amounts):,} {args.currency}")

if __name__ == "__main__":
    main()

予想結果です。

14,000 KRW

ヘルプとエラーの終了状態を調べる

次の二つの呼び出しも試します。

python sum_cli.py --help
python sum_cli.py 0 500 --currency KRW

二つ目は500 KRWを表示します。--currency EURは選択肢の検査に失敗します。負数や数値でない文字列はnonnegativeで引数エラーになります。通常のargparseの用法エラーは終了コード2となり、呼び出し元も失敗を区別できます。

金額なしの--helpでも説明が表示されます。ヘルプには実行パスなど環境依存の部分があるため、すべての文字を固定せず意味を確認します。

計算と操作の入口を分離する

操作が増えたらsubparsersでinit、add、listなどへ分けられます。計算関数へは必要な値を渡し、argparseのNamespace全体へ直接依存させない方が使い回しやすくなります。

0の受け入れ、負数・引数不足・不正な通貨の拒否を個別に試し、終了状態を確認して正しい引数へ戻します。最終支出管理アプリはサブコマンド、入力検証、永続化を組み合わせます。追加する操作にも、入力の契約と明確な失敗結果を用意します。

この--currencyは表示単位の選択で、為替換算ではありません。14000とUSDなら14,000 USDと表示するだけで、14,000 KRWをドルに換算しません。数値は選択した通貨の単位で入力します。実行直後にPowerShellの$LASTEXITCODE、macOS・Ubuntuのecho $?で終了値を確認します。

関連する公式リファレンス