プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

Pythonで引数を扱う

引数を扱うときに便利なのがParserです。簡単に引数を処理することができ、定義も簡単です。一度使えばsys.argvを直接処理する気なんてなくなるはずです。

PythonではいくつかParserの選択肢がありますがargparse一択だと思います。

標準ライブラリの選択肢

引数をParseする標準ライブラリにはgetopt、optparse、argpaseがあります。

getopt

  • C 言語の getopt() 関数に慣れ親しんだ人向けの実装
    • でもCを書ける人がargparseを学ぶ労力なんてゴミみたいなものじゃないかと

optparse

  • getoptより少しだけコード量が少なくなる
  • Python3.2 で非推奨になった
  • 将来、廃止予定

argparse

  • optparseの後継
  • Python Tutorialのおすすめ

argparseの基本的な使い方

parser = argparse.ArgumentParser()
parser.add_argument('-a', '--action', help='action for a file', required=True, choices=['show', 'delete'])
parser.add_argument('-f', '--file', help='name of a file', required=True)
args = parser.parse_args()
print(args.action)
print(args.file)

これだけで必須引数の有無確認、エラーやヘルプ表示などを自動で処理してくれます。

詳細はこちらで確認してください。

Argparse チュートリアル — Python 3.9.1 ドキュメント


感想

optparseは使ったことがありませんが、非推奨で廃止予定のものを今から使う理由はないと思います。

argparseをgetoptと比べるとヘルプ表示処理やいくつかのエラー処理を書かなくていい分、argparseの方が少し楽です。ただ劇的な差はない印象でした。

argparseにはなんでもできる柔軟性はありません。例えば「第一引数がAのときは第二引数はBかCで、第一引数がXのときは第二引数はYかZで、、」みたいな複雑な状況はargparseだけでは対応できません。ある程度の自分でコーディングする必要があります。

それでもsys.argvを直接処理するよりはかなり楽で、しかも標準ライブラリなので基本はこれでよいと思います。