argparse接受所有内容

14

有没有一种方法可以使argparse.ArgumentParser在读取未知选项时不会引发异常,而是将所有带值的未知选项放入一个字典中,没有值的放入一个列表中?

例如,假设在解析器中没有定义任何参数,我向prog.py传递了两个参数:

./prog.py --foo bar --baz

我想要以下内容:

parsed = parser.parse_args()
vals = parsed.unknown_with_vals
novals = parsed.unknown_without_vals

print(vals)
#{'foo' : 'bar'}
print(novals)
#['baz']

这个可以做到吗?


5
如果用类似这样的方式调用 ./prog.py --foo bar baz --quux,你希望它做什么?字典应该是 {"foo": ["bar", "baz"]} 吗?这个是否应该是一个错误?baz 应该被视为位置参数吗?基本上你正在要求一个全新的参数解析器:一般来说,最好只使用像 argparse.REMAINDER 值一样的 nargs 将所有意外的参数累积到一个列表中,然后自己处理它:http://docs.python.org/library/argparse.html#nargs - ben w
1个回答

10
known, unknown_args = parser.parse_known_args(...)

正如评论中@ben w所提到的,如何解析unknown_args由你决定,例如使用以下语法:

unknown_args = *(with_val / without_val) EOS
with_val = OPT 1*VALUE
without_val = OPT
OPT = <argument that starts with "--">
VALUE = <argument that doesn't start with "--">

或者使用正则表达式:

(O V+ | O)* $

注意:在这种情况下,禁止使用孤立值。

示例

d = {}
for arg in unknown_args:
    if arg.startswith('--'): # O
        opt = arg
        d[opt] = []
    else: # V
        d[opt].append(arg) #NOTE: produces NameError if an orphan encountered

with_vals = {k: v for k, v in d.items() if v}
without_vals = [k for k, v in d.items() if not v]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接