未提供值时命令行参数的默认值[重复]

Posted

技术标签:

【中文标题】未提供值时命令行参数的默认值[重复]【英文标题】:Default value of commandline parameters when no value is provided [duplicate] 【发布时间】:2014-08-07 23:06:11 【问题描述】:

我正在使用 ArgParse 在 Python 中提供命令行参数。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--quality", type=int,help="enter some quality limit")
args = parser.parse_args()
qual=args.quality

if args.quality:
  qual=0

$ python a.py --quality 

a.py: error: argument --quality: expected one argument

如果没有提供值,我想将其用作 0,我也尝试在 parser.add_argument 中将其设置为“default=0”,并使用 if 语句。但是,我得到了上面的错误.

基本上,我想将其用作标志并在未提供值的情况下提供默认值。

【问题讨论】:

【参考方案1】:

使用nargs='?' 允许--quality 与提供的0 或1 值一起使用。使用 const=0 处理 script.py --quality 而不提供值。使用default=0 处理对script.py 的裸调用(不提供--quality)。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--quality", type=int, help="enter some quality limit",
                    nargs='?', default=0, const=0)
args = parser.parse_args()
print(args)

行为如下:

% script.py 
Namespace(quality=0)
% script.py --quality
Namespace(quality=0)
% script.py --quality 1
Namespace(quality=1)

【讨论】:

【参考方案2】:

在https://docs.python.org/2/howto/argparse.html#id1 获得战利品。只需将参数 default 添加到您的 add_argument 调用中。

parser.add_argument("--quality", type=int, default=0, nargs='?', help="enter some quality limit")

如果您想使用--quality 作为标志,您应该使用action="store_true"。如果使用了--quality,这会将args.quality 设置为True

【讨论】:

【参考方案3】:

docopt 在文档字符串中使用 [default: 0]

故意忽略您问题的argparse 部分,这里是您如何使用docopt 定义默认值。

使用docopt,您可以将默认值(以及几乎所有其他值)定义为文档字符串的一部分。

首先,安装docopt 并用于验证值schema

$ pip install docopt schema

然后编写脚本a.py:

"""
Usage:
    a.py [--quality <qlimit>]
    a.py -h

Options:
    --quality=<qlimit>  Quality limit [default: 0]
"""
def main(quality):
    print "FROM MAIN: minimal quality was set to", quality

if __name__ == "__main__":
    from docopt import docopt
    from schema import Schema, And, Use, SchemaError
    args = docopt(__doc__)
    print args
    schema = Schema(
        "--quality": 
        And(Use(int), lambda n: 0 <= n, error="<qlimit> must be non-negative integer"),
        "-h": bool
    )
    try:
        args = schema.validate(args)
    except SchemaError as e:
        exit(e)
    quality = args["--quality"]
    main(quality)

并使用脚本,首先请求帮助字符串:

$ python a.py -h
Usage:
    a.py [--quality <qlimit>]
    a.py -h

Options:
    --quality=<qlimit>  Quality limit [default: 0]

然后使用默认值:

$ python a.py
'--quality': '0',
 '-h': False
FROM MAIN: minimal quality was set to 0

将非默认正确的 1 设置为 5:

$ python a.py --quality 5
'--quality': '5',
 '-h': False
FROM MAIN: minimal quality was set to 5

尝试不允许的负值:

$ python a.py --quality -99
'--quality': '-99',
 '-h': False
<qlimit> must be non-negative integer

或非整数一:

$ python a.py --quality poor
'--quality': 'poor',
 '-h': False
<qlimit> must be non-negative integer

注意,一旦validate 步骤通过,“--quality”键的值就已经转换为int

【讨论】:

以上是关于未提供值时命令行参数的默认值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用子解析器时,命令行参数被默认值覆盖

Bash 中的命令行参数 [重复]

SpringBoot修改JVM参数(内置Tomcat命令行启动和IDEA工具配置修改)

Go使用flag包开发命令行工具

如何在java中传递命令行参数[重复]

打印所有 argparse 参数,包括默认值