如
documentation所述:
'?'. One argument will be consumed from the command line if possible,
and produced as a single item. If no command-line argument is present,
the value from default will be produced. Note that for optional
arguments, there is an additional case – the option string is present
but not followed by a command-line argument. In this case the value
from const will be produced.
所以,你想要的行为是不能使用’?’获得的.也许你可以用argparse.Action写一些hack,并用以前的结果进行干预(1)
我认为更好的解决方案是拆分该选项的功能.使它成为需要参数的选项(但是选项本身是可选的),并添加一个没有参数的选项,将释放设置为“trunk”.以这种方式,您可以获得相同的结果,没有任何黑客.我也觉得界面比较简单.
在你的例子中:
python TAF.py -r smoketest
很清楚,smoketest将被解释为-r的参数.至少遵循unix约定.如果你想保持nargs =’?’那么用户必须使用 – :
$python TAF.py -r -- sometest
Namespace(release=None, testname=['sometest']) #parsed result
(1)关于如何做到这一点的想法:检查该选项是否有参数.如果它有一个检查是否是有效的测试名称.如果这样放入到testname并将释放设置为默认值.你也必须设置一个“标志”,告诉你这件事情发生了.
现在,在解析sys.argv之前,您必须重定向sys.stderr.在进行解析时,您必须抓取SystemExit,检查stderr,看看错误是否“太少参数”,检查标志是否设置,如果忽略该错误并继续运行,否则您应该重新打印到原始的stderr错误消息并退出.
这种方法看起来并不健壮,这可能是错误的.