Python argparse dict arg

前端 未结 9 1682
不知归路
不知归路 2021-02-01 04:31

I want to receive a dict(str -> str) argument from the command line. Does argparse.ArgumentParser provide it? Or any other library?

For the

9条回答
  •  闹比i
    闹比i (楼主)
    2021-02-01 04:47

    Here's another solution using a custom action, if you want to specify dict key pairs together comma-separated --

    import argparse
    import sys
    parser = argparse.ArgumentParser(description='parse key pairs into a dictionary')
    
    class StoreDictKeyPair(argparse.Action):
         def __call__(self, parser, namespace, values, option_string=None):
             my_dict = {}
             for kv in values.split(","):
                 k,v = kv.split("=")
                 my_dict[k] = v
             setattr(namespace, self.dest, my_dict)
    
    parser.add_argument("--key_pairs", dest="my_dict", action=StoreDictKeyPair, metavar="KEY1=VAL1,KEY2=VAL2...")
    
    args = parser.parse_args(sys.argv[1:])
    print args
    

    Running:

    python parse_kv.py --key_pairs 1=2,a=bbb,c=4 --key_pairs test=7,foo=bar
    

    Output:

    Namespace(my_dict={'1': '2', 'a': 'bbb', 'c': '4', 'test': '7', 'foo': 'bar'})
    

    If you want to use nargs instead of comma-separated values in string:

    class StoreDictKeyPair(argparse.Action):
         def __init__(self, option_strings, dest, nargs=None, **kwargs):
             self._nargs = nargs
             super(StoreDictKeyPair, self).__init__(option_strings, dest, nargs=nargs, **kwargs)
         def __call__(self, parser, namespace, values, option_string=None):
             my_dict = {}
             print "values: {}".format(values)
             for kv in values:
                 k,v = kv.split("=")
                 my_dict[k] = v
             setattr(namespace, self.dest, my_dict)
    
    parser.add_argument("--key_pairs", dest="my_dict", action=StoreDictKeyPair, nargs="+", metavar="KEY=VAL")
    
    args = parser.parse_args(sys.argv[1:])
    print args
    

    Running

    python arg_test4.py --key_pairs 1=2 a=bbb c=4 test=7 foo=bar
    

    Outputs:

    values: ['1=2', 'a=bbb', 'c=4', 'test=7', 'foo=bar']
    Namespace(my_dict={'1': '2', 'a': 'bbb', 'c': '4', 'test': '7', 'foo': 'bar'})
    

提交回复
热议问题