Python 命令行之旅 —— 深入 argparse (一) (2)

可选参数通常用于:用户提供一个参数以及对应值,则使用该值;若不提供,则使用默认值。如:

>>> parser.add_argument('--name', '-n') >>> parser.parse_args(['--name', 'Eric']) # 通过长参数指定名称 Namespace(name='Eric') >>> parser.parse_args(['-n', 'Eric']) # 通过短参数指定名称 Namespace(name='Eric') >>> parser.parse_args([]) # 不指定则默认为 None Namespace(name=None) 参数类型

参数类型 就是解析器参数值是要作为什么类型去解析,默认情况下是 str 类型。我们可以通过 type 入参来指定参数类型。

argparse 所支持的参数类型多种多样,可以是 int、float、bool等,比如:

>>> parser.add_argument('-i', type=int) >>> parser.add_argument('-f', type=float) >>> parser.add_argument('-b', type=bool) >>> parser.parse_args(['-i', '1', '-f', '2.1', '-b', '0']) Namespace(b=False, f=2.1, i=1)

更厉害的是,type 入参还可以是可调用(callable)对象。这就给了我们很大的想象空间,可以指定 type=open 来把参数值作为文件进行处理,也可以指定自定义函数来进行类型检查和类型转换。

作为文件进行处理:

>>> parser.add_argument('--file', type=open) >>> parser.parse_args(['--file', 'README.md']) Namespace(b=None, f=None, file=<_io.TextIOWrapper mode='r' encoding='cp936'>, i=None)

使用自定义函数进行处理,入参为参数值,需返回转换后的结果。
比如,对于参数 --num,我们希望当其值小于 1 时则返回 1,大于 10 时则返回 10:

>>> def limit(string): ... num = int(string) ... if num < 1: ... return 1 ... if num > 10: ... return 10 ... return num ... >>> parser.add_argument('--num', type=limit) >>> parser.parse_args(['--num', '-1']) # num 小于1,则取1 Namespace(num=1) >>> parser.parse_args(['--num', '15']) # num 大于10,则取10 Namespace(num=10) >>> parser.parse_args(['--num', '5']) # num 在1和10之间,则取原来的值 Namespace(num=5) 参数默认值

参数默认值 用于在命令行中不传参数值的情况下的默认取值,可通过 default 来指定。如果不指定该值,则参数默认值为 None。

比如:

>>> parser.add_argument('-i', default=0, type=int) >>> parser.add_argument('-f', default=3.14, type=float) >>> parser.add_argument('-b', default=True, type=bool) >>> parser.parse_args([]) Namespace(b=True, f=3.14, i=0) 位置参数

位置参数 就是通过位置而非是 - 或 -- 开头的参数来指定参数值。

比如,我们可以指定两个位置参数 x 和 y ,先添加的 x 位于第一个位置,后加入的 y 位于第二个位置。那么在命令行中输入 1 2的时候,分别对应到的就是 x 和 y:

>>> parser.add_argument('x') >>> parser.add_argument('y') >>> parser.parse_args(['1', '2']) Namespace(x='1', y='2') 可选值

可选值 就是限定参数值的内容,通过 choices 入参指定。

有些情况下,我们可能需要限制用户输入参数的内容,只能在预设的几个值中选一个,那么 可选值 就派上了用场。

比如,指定文件读取方式限制为 read-only 和 read-write:

>>> parser.add_argument('--mode', choices=('read-only', 'read-write')) >>> parser.parse_args(['--mode', 'read-only']) Namespace(mode='read-only') >>> parser.parse_args(['--mode', 'read']) usage: [-h] [--mode {read-only,read-write}] : error: argument --mode: invalid choice: 'read' (choose from 'read-only', 'read-write') 互斥参数

互斥参数 就是多个参数之间彼此互斥,不能同时出现。使用互斥参数首先通过 ArgumentParser.add_mutually_exclusive_group 在解析器中添加一个互斥组,然后在这个组里添加参数,那么组内的所有参数都是互斥的。

比如,我们希望通过命令行来告知乘坐的交通工具,要么是汽车,要么是公交,要么是自行车,那么就可以这么写:

>>> group = parser.add_mutually_exclusive_group() >>> group.add_argument('--car', action='store_true') >>> group.add_argument('--bus', action='store_true') >>> group.add_argument('--bike', action='store_true') >>> parser.parse_args([]) # 什么都不乘坐 Namespace(bike=False, bus=False, car=False) >>> parser.parse_args(['--bus']) # 乘坐公交 Namespace(bike=False, bus=True, car=False) >>> parser.parse_args(['--bike']) # 骑自行车 Namespace(bike=True, bus=False, car=False) >>> parser.parse_args(['--bike', '--car']) # 又想骑车,又想坐车,那是不行的 usage: [-h] [--car | --bus | --bike] : error: argument --car: not allowed with argument --bike 可变参数列表

可变参数列表 用来定义一个参数可以有多个值,且能通过 nargs 来定义值的个数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppdfj.html