【问题标题】:argparse accept everythingargparse 接受一切
【发布时间】:2017-07-27 23:51:28
【问题描述】:

有没有办法让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']

这个可以吗?

【问题讨论】:

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

标签: python argparse


【解决方案1】:
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)* $

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

Example

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]

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 2017-06-01
    • 2021-07-15
    • 1970-01-01
    • 2019-09-14
    • 2017-12-22
    • 1970-01-01
    • 2012-07-15
    • 2017-12-14
    相关资源
    最近更新 更多