はじめに
Pythonではコマンドライン引数のパースには標準ライブラリ argparse
が使われます。
このライブラリはかなり高機能なので、しっかりしたアプリケーションを設計したい場面ならきっと便利に使えます。
しかし、毎回毎回そんなにしっかり設計できるものでもないです。
もともとコマンドライン引数を使わないスクリプトとして書き始めたのに、いつのまにか sys.argv
があちこちに書かれているような人も多いのではないでしょうか。
ありがちな状況
# bad.py
import sys
foo = sys.argv[1]
bar = sys.argv[2]
print('foo ==', foo)
print('bar ==', bar)
$ python bad.py 12 34
foo == 12
bar == 34
これでは、引数で何を渡しているのか全くわかりません。
せめてPythonの関数でいうところの **kwargs
みたいなものが欲しくなりますよね?
提案
# better.py
def arg(*flags, args=None, **kwargs):
import argparse
p = argparse.ArgumentParser()
p.add_argument(*flags, **kwargs)
ns, _ = p.parse_known_args(args)
return next(getattr(ns, d) for d in dir(ns) if not d.startswith('_'))
foo = arg('--foo')
bar = arg('--bar')
print('foo ==', foo)
print('bar ==', bar)
$ python better.py --foo=12 --bar=34
foo == 12
bar == 34
いかがでしょう、ちょっとはマシになったんじゃないでしょうか。