Argparse:“可选参数"下列出的必需参数? [英] Argparse: Required arguments listed under "optional arguments"?

查看:28
本文介绍了Argparse:“可选参数"下列出的必需参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用下面的简单代码来解析一些参数;请注意,其中之一是必需的.不幸的是,当用户在没有提供参数的情况下运行脚本时,显示的用法/帮助文本并不表示存在非可选参数,我觉得这很令人困惑.我怎样才能让 python 表明一个参数不是可选的?

I use the following simple code to parse some arguments; note that one of them is required. Unfortunately, when the user runs the script without providing the argument, the displayed usage/help text does not indicate that there is a non-optional argument, which I find very confusing. How can I get python to indicate that an argument is not optional?

代码如下:

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 )

在不提供所需参数的情况下运行上面的代码时,我得到以下输出:

When running above code without providing the required argument, I get the following 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

推荐答案

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

Parameters starting with - or -- are usually considered optional. All other parameters are positional parameters and as such required by design (like positional function arguments). It is possible to require optional arguments, but this is a bit against their design. Since they are still part of the non-positional arguments, they will still be listed under the confusing header "optional arguments" even if they are required. The missing square brackets in the usage part however show that they are indeed required.

另见文档:

一般来说,argparse 模块假定像 -f 和 --bar 这样的标志表示可选参数,它们总是可以在命令行中省略.

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.

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

That being said, the headers "positional arguments" and "optional arguments" in the help are generated by two argument groups in which the arguments are automatically separated into. Now, you could "hack into it" and change the name of the optional ones, but a far more elegant solution would be to create another group for "required named arguments" (or whatever you want to call them):

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

这篇关于Argparse:“可选参数"下列出的必需参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆