90600


Pythonが起動されたときのコマンドラインオプションをパースし、  
コマンドライン引数を、リストデータと、辞書データとして取得することはできないでしょうか？

実行するコマンドライン

[code]

    python3 test.py aa bb --key1 10 --key2 20
    
[/code]

Pythonで取得したいデータ

[code]

    arg_list = ['aa', 'bb']
    arg_map = { 'key1':'10', 'key2':'20' }
    
[/code]

argparseを利用すればできそうなのですが、  
可変長のリストデータと、辞書データとして分割して取得することは可能でしょうか？


CC BY-SA 4.0
2022-08-17T15:16:46.587
90595
2022-08-18T00:50:51.157
2022-08-17T16:36:19.930
3060
35267
question
python python3
可変長のコマンドラインオプションから、リストデータと辞書データに変換して取得したい


コメントで示したように、`aa
bb`のパラメータについても指定するためのオプションを追加したり、辞書は1個1個をオプションとするのではなく辞書型パラメータのオプションとして定義すれば出来ます。  
可変長(というか可変個数)とするには、[add_argument()](https://docs.python.org/ja/3/library/argparse.html#argparse.ArgumentParser.add_argument)
の [nargs](https://docs.python.org/ja/3/library/argparse.html#nargs)
パラメータに`'+'`(1個以上)または`'*'`(0個でも可)を指定すれば良いでしょう。

こちらの記事を参考に：  
[[Python] ArgumentParser
でコマンドライン引数を解析する](https://webbibouroku.com/Blog/Article/python-argparse)  
[Pythonでリスト型のコマンドライン引数を受け取る](https://qiita.com/hook125/items/0ffc6b9391ccb0abcd52)  
[python-argparseで辞書型のオプションを与える](https://qiita.com/Hi-
king/items/de960b6878d6280eaffc)  
[How can I pass a list as a command-line argument with
argparse?](https://stackoverflow.com/q/15753701/9014308)

上記記事やPythonの仕様説明を混ぜてこんな風に出来るでしょう。

[code]

    import argparse
    
    class DictArgs(argparse.Action):
        """
        --dict foo=a型の引数を辞書に入れるargparse.Action
        """
        def __call__(self, parser, namespace, values, option_strings=None):
            arg_dict = getattr(namespace,self.dest,[])
            if arg_dict is None:
                arg_dict = {}
    
            for x in values:
                k, v = x.split("=")
                arg_dict[k] = v
    
            setattr(namespace, self.dest, arg_dict)
    
    parser = argparse.ArgumentParser(description='an example program')
    
    parser.add_argument('-l', '--list', required=False, nargs='*', help='list of string variables') 
    parser.add_argument('-d', '--dict', required=False, nargs='*', action=DictArgs, help='dictionary variables')
    
    args = parser.parse_args()
    
    print(args.list)
    print(args.dict)
    
[/code]

(Windowsでは)こんな風にコマンドラインで指定して実行すれば：

[code]

    py argsample.py --list aa bb --dict key1=10 key2=20
    
[/code]

printの結果はこんな風に表示されます。

[code]

    ['aa', 'bb']
    {'key1': '10', 'key2': '20'}
    
[/code]


CC BY-SA 4.0
2022-08-18T00:50:51.157
90600
2022-08-18T00:50:51.157
26370
90595
answer