問題
コマンドラインオプションで,複数の値を入れたいが,リスト形式じゃなく,名前付きの辞書として入れたい
つまり
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'}