可选参数通常用于:用户提供一个参数以及对应值,则使用该值;若不提供,则使用默认值。如:
>>> 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:
参数默认值 用于在命令行中不传参数值的情况下的默认取值,可通过 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 来定义值的个数。