Argparse:“可选参数”下列出的必需参数?
我使用下面的简单代码来解析一些参数; 请注意其中一个是必需的。 不幸的是,当用户在不提供参数的情况下运行脚本时,显示的用法/帮助文本并不表示存在非可选参数,这让我感到非常困惑。 我怎样才能让python指出参数不是可选的?
代码如下:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Foo')
parser.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
args = parser.parse_args()
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )
在没有提供所需参数的情况下运行代码时,我得到以下输出:
usage: foo.py [-h] -i INPUT [-o OUTPUT]
Foo
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input file name
-o OUTPUT, --output OUTPUT
Output file name
以-
或--
开头的参数通常被认为是可选的。 所有其他参数都是位置参数,正如设计所要求的那样(如位置函数参数)。 可以要求可选的参数,但这有点违背他们的设计。 由于它们仍然是非位置参数的一部分,即使它们是必需的,它们仍将列在令人困惑的标题“可选参数”下。 然而,使用部分中丢失的方括号表明它们确实是必需的。
另见文件:
通常,argparse模块假定像-f和--bar这样的标志表示可选参数,在命令行中始终可以省略这些参数。
注:所需的选项通常被认为是不好的形式,因为用户期望选项是可选的,因此应尽可能避免。
也就是说,帮助中的头文件“位置参数”和“可选参数”由两个参数组生成,参数自动分成两个参数组。 现在,你可以“入侵它”并改变可选属性的名称,但更好的解决方案是为“所需命名参数”(或者你想要调用它们的任何名称)创建另一个组:
parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('-o', '--output', help='Output file name', default='stdout')
requiredNamed = parser.add_argument_group('required named arguments')
requiredNamed.add_argument('-i', '--input', help='Input file name', required=True)
parser.parse_args(['-h'])
usage: [-h] [-o OUTPUT] -i INPUT
Foo
optional arguments:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output file name
required named arguments:
-i INPUT, --input INPUT
Input file name
由于我更愿意在可选之前列出必需的参数,因此我通过以下方式对其进行了破解
parser = argparse.ArgumentParser()
parser._action_groups.pop()
required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')
required.add_argument('--required_arg')
optional.add_argument('--optional_arg')
return parser.parse_args()
并输出:
usage: main.py [-h] [--required_arg REQUIRED_ARG]
[--optional_arg OPTIONAL_ARG]
required arguments:
--required_arg REQUIRED_ARG
optional arguments:
--optional_arg OPTIONAL_ARG
我可以在没有“帮助”的情况下生活在可选参数组中。
建立@Karl Rosaen
parser = argparse.ArgumentParser()
optional = parser._action_groups.pop() # Edited this line
required = parser.add_argument_group('required arguments')
# remove this line: optional = parser...
required.add_argument('--required_arg')
optional.add_argument('--optional_arg')
parser._action_groups.append(optional) # added this line
return parser.parse_args()
并输出:
usage: main.py [-h] [--required_arg REQUIRED_ARG]
[--optional_arg OPTIONAL_ARG]
required arguments:
--required_arg REQUIRED_ARG
optional arguments:
-h, --help show this help message and exit
--optional_arg OPTIONAL_ARG
链接地址: http://www.djcxy.com/p/28559.html
上一篇: Argparse: Required arguments listed under "optional arguments"?