带有命名参数的Python parse_known_args

时间:2016-09-07 11:26:04

标签: python argparse

我想将--arg1 value1格式的任意一组参数传递给我的python脚本,并在类{'arg1': 'value1}的字典中检索它们。我想用argparse来实现这一目标。函数parse_known_args允许额外的args,但它们可以作为简单列表检索,并且不会被命名。

2 个答案:

答案 0 :(得分:2)

更好的想法是定义一个选项,它接受两个参数,一个名称和一个值,并使用自定义操作使用这两个参数更新字典。

class OptionAppend(Action):
    def __call__(self, parser, namespace, values, option_string):
        d = getattr(namespace, self.dest)
        name, value = values
        d[name] = value

p.add_argument("-o", "--option", nargs=2, action=OptionAppend, default={})

然后代替myscript --arg1 value1 --arg2 value2,你会写myscript -o arg1 value1 -o arg2value1,而args = parser.parse_args()之后,你会args.o == {'arg1': 'value1, 'arg2': 'value2'}

这有点类似于使用列表或字典来保存一组相关变量,而不是一组单独命名的变量。

 # Good
 v = [x, y, z]
 v = { 'key1': x, 'key2': y, 'key3': z}
 # Bad
 v1 = x
 v2 = y
 v3 = z

答案 1 :(得分:0)

处理任意键/值对的问题已多次出现。 argparse没有内置机制。

Is it possible to use argparse to capture an arbitrary set of optional arguments?(几乎与去年五月相同)

您使用parse_know_args然后从extras进行自己的字典构建的想法很好 - 也许是最简单的。处理附加列表的方式取决于用户的行为(可预测'--key', 'value'对)。这与您直接解析sys.arv[1:]基本相同。

如果用户提供类似--options key1:value1 key2=value2 "key3 value3"的输入,您可以在自定义Action类中解析这些对(例如,在分隔符上拆分字符串等)。

--options "{key1: value1, key2: value2}"之类的输入可以作为JSON字符串处理,其类型函数如下:type=json.load(我必须查看它)。