繁体   English   中英

使用Python的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM