如何让位置参数和聚合参数在python argparse中共存?

时间:2018-11-30 15:55:20

标签: python-3.x argparse

我有一个位置参数bar和另一个参数foo解析为一个列表:

import argparse
p = argparse.ArgumentParser()
p.add_argument('-foo', nargs='+')
p.add_argument('bar')

如果bar进行foo,则一切正常

print(p.parse_args('b -foo f1 f2 f3'.split()))

这引起Namespace(bar='b', foo=['f1', 'f2', 'f3'])

但是,如果barfoo之后,则会抱怨未提供bar,即

print(p.parse_args('-foo f1 f2 f3 b'.split()))

给予给予

  

用法:主要。py[-h] [-foo FOO [FOO ...]]条   主要 .py:错误:需要以下参数:bar

不幸的是,使用提示实际上提示了错误的顺序。

实际上,我是在现有解析器中添加nargs='+'来添加功能,并且某些地方的脚本可能具有“错误”的顺序,即-foo的收益bar。而且我不想破坏/修复它们。

一种可能的方法是代替使用

p.add_argument('-foo', action='append')

然后该命令需要由

触发
print(p.parse_args('-foo f1 -foo f2 -foo f3 b'.split()))

它可以解决问题,但是有点冗长。这是最好的吗?

1 个答案:

答案 0 :(得分:0)

我知道没有一个简单的解决方法。如果您愿意,我可以找到讨论该问题的错误/问题。

首先,关于用法-使用代码将可选内容和位置信息分开,并最后显示位置信息,大致与常规POSIX惯例相对应。您当然可以编写自己的用法行。

对于解析,它交替解析解析位置和可选内容。当处理位置时,它根据nargs分配字符串(直到下一个标志字符串)(可以一次处理多个位置)。并且在处理可选内容时,它会根据其nargs分配值。

因此,在您的情况下,将--foo+一起使用将所有内容存储到下一个标记(或'-'),而不会为随后的位置保留任何内容。

bar保留一个字符串将需要进行一些前瞻。添加到现有代码中并不是一件简单的事情。