Argparse:“可选参数”下列出的必要参数?

我使用下面的简单代码来parsing一些参数; 注意其中一个是必需的。 不幸的是,当用户不提供参数的情况下运行脚本时,显示的用法/帮助文本并不表示有一个非可选的参数,这让我感到非常困惑。 我怎么能得到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 

---开始的参数通常被认为是可选的。 所有其他参数都是位置参数,正如devise所要求的那样(比如位置函数参数)。 可以要求可选的参数,但这有点违背他们的devise。 由于它们仍然是非定位参数的一部分,即使它们是必需的,它们仍将列在令人困惑的标题“可选参数”下面。 用法部分中缺less的方括号表明它们确实是必需的。

另见文件 :

通常,argparse模块假定像-f和–bar这样的标志表示可选参数,在命令行中总是可以省略。

注:所需的选项通常被认为是不好的forms,因为用户期望选项是可选的,因此应尽可能避免。

也就是说,帮助中的头文件“位置参数”“可选参数”由两个自variables被自动分隔的参数组生成。 现在,你可以“入侵它”,并改变可选的名称,但更优雅的解决scheme是创build另一个“所需的命名参数”(或任何你想调用它们)的组:

 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 

我可以在没有“帮助”的情况下生活在可选参数组中。

build立@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 

这很棒。 解决显示在第二个可选列表中的–help项目。