Python标准库系列-argparse

Python 3提供了一系列标准库,所提供的组件设计范围十分广泛。这个标准库包含了多个内置模块(以C编写),Python可以依靠这些标准库提供许多系统级功能,例如文件I/O,此外还有大量以Pyhon编写的模块,提供了许多日常编程中许多问题的标准解决方案。具体的列表可以点击Python标准库了解。

今天提供的就是argparse这个标准库的使用说明

argparse

在命令行内,我们调用一个函数,一般会有函数名,位置参数和可选参数。比如ls指令

ls
ls directory
ls -l
ls --help

其中directory就是位置参数,-l就是可选参数,以及一个帮助的--help参数

基本用法

先从一个最简单的例子开始

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

下面是代码运行结果

$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]

optional arguments:
  -h, --help  show this help message and exit
$ python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo

程序运行情况如下:

  • 在没有任何选项的情况下运行脚本不会在标准输出显示任何内容。这没有什么用处

  • 第二行代码开始展现出argparse模块的作用。我们几乎什么也没有做,但已经得到一条很好的帮助信息。

  • --help选项,也可缩写为-h,是唯一一个可以直接使用的选项(即不需要指定该选项的内容)。指定任何内容都会导致错误。即便如此,我们也能直接得到一条有用的用法信息。

接下来我们来分别探究位置参数和可选餐具

位置参数

位置参数的添加只需要添加指代信息就可以了。比如

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('echo', help="echo the string you use here")
args = parser.parse_args()
print(args.echo)

help可以做出系统提示,便于对参数含义的推断

这时候运行prog.py·就必须提供一个参数作为echo的值,不然系统就好提示报错

$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo

$ python3 prog.py foo
foo

参数的输入默认都是字符串形式,需要修改的可以用type指明

parser.add_argument("square", help="display a square of a given number",type=int)

可选参数

可选参数有两种。一种是指定一个参数,一种是只需要知道True/False。我们也分别有两种方法

指定参数

我们需要添加一个--verbosity的参数,并希望函数打印出来

import argparse  
parser = argparse.ArgumentParse()
parser.add_argument('--verbosity', help='increse output verbosity')
args = parser.parse_args()
if args.verbosity:
  print(args.verbosity)

这种类型的参数必须指定一个值,不然就会报错。如果不添加这个参数,这个变量就是None,所以可以判断逻辑真假。如果指定了任何值,逻辑判断都会是真。

二元参数

很多时候我们希望只有真/假两个参数,这时我们可以这样写代码

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', help='show output verbosity', action='store_true')
args = parser.parse_args()
if args.verbose:
  print('verbosity turned on')

这种情况下,选项更多的是一个标志,而非接受一个值。这就意味着,当选项存在时,args.verbose就是真,否则隐式的赋值为假。这时如果指定值,就会报错。

进阶操作

现在我们已经看到了基本的参数设置。接下来我们来一些进阶操作

短选项

有时我们的可选参数命名太长,我们可以用首字母或缩写来提供短选项。

parser.add_argument("-v", "--verbose", help="increase output verbosity",action="store_true")

控制可以接受的值

我们可以提供可以接受的值范围来使得我们的程序不至于运算错误

parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity")

通过重复使用来计数

argparse还提供了count功能,这样每一次使用一次可选参数,这个参数的值就+1。但是 如果不使用,该参数为None

parser.add_argument("-v", "--verbosity", action="count",help="increase output verbosity")

可以用default来解决这个问题

parser.add_argument("-v", "--verbosity", action="count", default=0,help="increase output verbosity")

矛盾选项

add_mutually_exclusive_group()它允许我们指定彼此相互冲突的选项。 让我们再更改程序的其余部分以便使用新功能更有意义:我们将引入 –quiet 选项,它将与 –verbose 正好相反。这用就不能同时使用两者。

import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")

描述功能

可以在一开始就把程序的目的写清楚

import argparse

parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print(answer)
elif args.verbose:
    print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
    print("{}^{} == {}".format(args.x, args.y, answer))

这用如果我们不清楚程序的使用方法,我们可以用-h得到使用文档

$ python3 prog.py --help
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
  x              the base
  y              the exponent

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, --quiet

常见使用方法

一般argparse会在__name__=="__main__"中使用。将args传给main(args)函数,使得结构逻辑和数据分开来。但是如果配置较多较复杂,建议使用其他的配置文件,比如YAML文件来配置深度学习网络的一些参数


Python标准库系列

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

Python标准库系列-glob 上一篇
Python标准库系列-heapq 下一篇