使用Python的argparse可选的位置参数

And*_*ias 4 python 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())
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./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
Run Code Online (Sandbox Code Playgroud)

为什么不接受第三个程序调用?这是argparse的限制吗?

aba*_*ert 6

这是argparse的限制 - 但是在3.7中部分解除了.

Unix工具通常不声称支持选项和参数的混合,即使它们经常这样做.问题是将它与其他一些功能(如子命令)相结合会导致歧义.因此,通常情况下,支持任何这些功能的库会解决问题并且不允许混合.或者他们在最后,开始时和某些难以预测的情况下做了一些允许选择的东西,而不是中间的其他情况.

这就是argparse最初的做法.但3.7增加了混合解析.

你必须手动调用parse_intermixed_args而不是parse_args.

如果你试图将它与任何不合适的功能一起使用,你将得到一个例外(即使你传递的特定args集没有歧义 - 这应该使它更容易调试).

但除此之外,它将按预期工作:选项(当然还有它们的值)可以在命令行的任何位置自由地与位置参数混合.


不幸的是,我不知道PyPI上的后备端口argparse在早期版本中获得3.7 ; 半官方argparse后端主要用于完全没有它的2.7/3.2之前的版本,只反向3.4版本.