Python的argparse的可选位置参数

时间:2018-07-07 21:34:05

标签: 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())

输出:

$ ./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的限制吗?

1 个答案:

答案 0 :(得分:6)

这是argparse的局限性,但在3.7中已部分取消。

Unix工具通常不声称支持选项和参数的混合,即使它们经常支持。问题在于将其与其他功能(如子命令)结合使用会导致歧义。因此,通常,支持所有这些功能的库都会在问题上出现问题,并且不允许混用。或者,他们采取了一些骇人听闻的做法-在最后,开始时以及在某些难以预测的情况下允许选择,而在中间情况下则不允许。

argparse最初就是这样做的。但是3.7添加了Intermixed parsing

您必须手动调用parse_intermixed_args而不是parse_args

并且,如果您尝试将其与任何不合适的功能一起使用,则会出现异常(即使您传递的特定参数集没有歧义,这也将使其更容易调试)。

但是,否则它将按预期工作:选项(当然还有它们的值)可以在命令行中的任意位置与位置参数自由混合。


不幸的是,我不知道在PyPI上有一个向后移植以在早期版本中获得3.7 argparse的功能。半官方的argparse反向移植主要用于根本没有2.7 / 3.2之前的版本,而仅反向移植3.4版本。