[英]How to set optional arguments to positional arguments in Python's Argparse?
[英]Optional positional arguments with Python's argparse
试图解析可选的位置参数我遇到了以下问题:
例:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('infile')
parser.add_argument('outfile', nargs='?')
parser.add_argument('-v', action='store_true')
print(parser.parse_args())
输出:
$ ./x.py -v in out
Namespace(infile='in', outfile='out', v=True)
$ ./x.py in out -v
Namespace(infile='in', outfile='out', v=True)
$ ./x.py in -v out
usage: x.py [-h] [-v] infile [outfile]
x.py: error: unrecognized arguments: out
为什么不接受第三个程序调用? 这是argparse的限制吗?
这是argparse的限制 - 但是在3.7中部分解除了。
Unix工具通常不声称支持选项和参数的混合,即使它们经常这样做。 问题是将它与其他一些功能(如子命令)相结合会导致歧义。 因此,通常情况下,支持任何这些功能的库会解决问题并且不允许混合。 或者他们在最后,开始时和某些难以预测的情况下做了一些允许选择的东西,而不是中间的其他情况。
这就是argparse
原来做的。 但3.7增加了混合解析 。
您必须手动调用parse_intermixed_args
而不是parse_args
。
如果你试图将它与任何不合适的功能一起使用,你将得到一个异常(即使你传递的特定args集没有歧义 - 这应该使它更容易调试)。
但除此之外,它将按预期工作:选项(当然还有它们的值)可以在命令行的任何位置自由地与位置参数混合。
不幸的是,我不知道在PyPI上有一个drop-in backport来获得早期版本中的3.7 argparse
; 半官方的argparse
backport主要用于2.7 / 3.2之前的版本,根本没有它,只反向3.4版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.