LoginSignup
5
4

More than 5 years have passed since last update.

python-argparseで辞書型のオプションを与える

Last updated at Posted at 2014-06-15

問題

コマンドラインオプションで,複数の値を入れたいが,リスト形式じゃなく,名前付きの辞書として入れたい

つまり
hoge.py --param a=foo --param b=bar ってしたときに param = {"a": "foo", "b": "bar"]という引数を取り出したい.

解決策

オリジナルのargparse.Actionを定義します.Actionを継承したクラスを作って,callメソッドをオーバーライドすれば良いです.

valuesに生の文字列が入ってるくるので,それをnamespaceに適切に追加してけばいいのですが,今回の問題ではnamespace.paramが既に存在している可能性があるのでそのチェックを入れます.ちなみにself.destには"param"という文字列が入ってきます.

import argparse
class ParamProcessor(argparse.Action):
    """
    --param foo=a型の引数を辞書に入れるargparse.Action
    """
    def __call__(self, parser, namespace, values, option_strings=None):
        param_dict = getattr(namespace,self.dest,[])
        if param_dict is None:
            param_dict = {}

        k, v = values.split("=")
        param_dict[k] = v
        setattr(namespace, self.dest, param_dict)

使ってみる

parser=argparse.ArgumentParser()
parser.add_argument("--param", action=ParamProcessor)

args = parser.parse_args()
print(args.param)
$ python hoge.py --param foo=a --param bar=b
>>> {'foo': 'a', 'bar': 'b'}
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4