我有一个位置参数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'])
。
但是,如果bar
在foo
之后,则会抱怨未提供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()))
它可以解决问题,但是有点冗长。这是最好的吗?
答案 0 :(得分:0)
我知道没有一个简单的解决方法。如果您愿意,我可以找到讨论该问题的错误/问题。
首先,关于用法-使用代码将可选内容和位置信息分开,并最后显示位置信息,大致与常规POSIX惯例相对应。您当然可以编写自己的用法行。
对于解析,它交替解析解析位置和可选内容。当处理位置时,它根据nargs
分配字符串(直到下一个标志字符串)(可以一次处理多个位置)。并且在处理可选内容时,它会根据其nargs
分配值。
因此,在您的情况下,将--foo
与+
一起使用将所有内容存储到下一个标记(或'-'),而不会为随后的位置保留任何内容。
为bar
保留一个字符串将需要进行一些前瞻。添加到现有代码中并不是一件简单的事情。