命令行参数未提供值时的默认值
我在用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 个回答
使用 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
类型。
你可以看看这个链接: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
。
使用 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)