命令行参数未提供值时的默认值

12 投票
3 回答
15644 浏览
提问于 2025-04-18 10:08

我在用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语句。但是,我遇到了上面的错误。

总的来说,我想把它当作一个标志,如果没有提供值,就给它一个默认值。

3 个回答

-1

使用 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

如果想设置一个非默认的正确值为 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 类型。

1

你可以看看这个链接:https://docs.python.org/2/howto/argparse.html#id1。只需要在你调用 add_argument 的时候加上一个 default 参数。

比如,你可以这样写:parser.add_argument("--quality", type=int, default=0, nargs='?', help="输入一些质量限制")

如果你想把 --quality 当作一个标志来用,那么你应该加上 action="store_true"。这样的话,如果使用了 --quality,那么 args.quality 就会被设置为 True

12

使用 nargs='?' 可以让 --quality 这个选项接受 0 或 1 个值。用 const=0 可以处理这种情况:当你输入 script.py --quality 但没有给出值时,它会默认用 0。用 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)

撰写回答