python - Argparse:在 "optional arguments"下列出的必需参数?

标签 python 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

最佳答案

--- 开头的参数通常被认为是可选的。所有其他参数都是位置参数,因此设计需要(如位置函数参数)。可能需要可选参数,但这有点违背他们的设计。由于它们仍然是非位置参数的一部分,即使它们是必需的,它们仍然会列在令人困惑的标题“可选参数”下。然而,用法部分中缺少的方括号表明它们确实是必需的。

另见documentation :

In general, the argparse module assumes that flags like -f and --bar indicate optional arguments, which can always be omitted at the command line.

Note: Required options are generally considered bad form because users expect options to be optional, and thus they should be avoided when possible.

话虽如此,帮助中的标题 “位置参数”“可选参数” 是由两个参数组生成的,其中参数自动分成。现在,您可以“破解”并更改可选参数的名称,但更优雅的解决方案是为“必需的命名参数”(或任何您想调用的名称)创建另一个组:

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

关于python - Argparse:在 "optional arguments"下列出的必需参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24180527/

相关文章:

python - 有没有办法在 argparse 中添加一个已经创建的解析器作为子解析器?

python - 如何向 django app python 模块添加属性?

python - 从标准输出获取时间戳后的行

python - 如何区分argparse,python中的默认值和用户给定值?

python - 如何在 argparse 中添加带有子解析器的可选位置参数?

python - 有没有办法在设置有意义的默认值时确定是否在命令行中指定了参数?

python - 使用 opencv - python 检测 W2 中的单个框

python - 命令 screen.fill() 不会重置屏幕上的对象

python - 为我的 Django 项目中的每个应用程序创建自定义 404 错误?

python - 如何使用argparse python为两个类别设置不同的强制性参数?