本文主要记录一下自己遇到的一个非常坑的bug,真的是搞了我好几天才调出来,一开始甚至都怀疑机器坏了。。。(虽然显然不可能,机器永远是对的)
好了,下面直入话题,我犯的错误就是该模块中的type
选项,这个涉及到的内容非常容易出错。
在开始时我一直觉得只要学会使用default
选项以及知道如何在终端中设置值就可以了,其实还有很多细节需要注意,下面重点讲一下一些容易忽视的选项在什么场景下使用。
type选项
type可以指定为int,bool,list,str
等,默认情况下为str
,我们从命令行里传入的内容一开始的type都是字符串类型,argparse
库自动根据你指定的type
调用对应的转换函数,但是default和终端时候不一样的,你写的内容是什么格式就对应什么格式,举个例子(一个非常常见的错误):
import argparse
parser = argparse.ArgumentParser(description='bool测试')
parser.add_argument('--flag', type=bool, default=False)
args = parser.parse_args()
print(args.flag)
- 假如你在终端中用
python demo.py --flag=False
,那么最终的结果你会发现,最终会打印出True
,因为终端读进去的是字符串类型,库函数后台的type=bool
转换规则是非空串都是True
,只有传入''
才是False
- 假如你没有指定
type=bool
,那默认读取的就是字符串类型,后面如果你用到了if args.flag
最后的判断结果永远是True
关于bool
类型,推荐的设置方式如下方式:
action
parser.add_argument('--flag', action='store_true')
store_true
表示设置了就是True
,终端运行,python demo.py --flag
打印就是True,这个时候就没有必要用default
选项了。
required
parser.add_argument('--flag', required=True)
可以使用这个选项设置需要在终端中强制设置该参数,在需要调参时非常重要,因为你不一定什么时候用了default
参数就给整错实验配置了。但是这个参数和action
显然不能同时使用
nargs
用来说明传入的参数个数,'+'表示传入至少一个参数,这一参数常常用在需要传入列表的时候,如下面这个例子:
import argparse
parser = argparse.ArgumentParser()
## nargs='+'接受1个或多个参数,
## nargs='*'接受零个或多个
parser.add_argument('--list', nargs='+', help='<Required> Set flag', required=True)
args = parser.parse_args()
if __name__ == '__main__':
print(args.list)
这个参数主要用在需要再终端中传入列表的情形,运行时传入参数之间用空格间隔,注意:指定type=list是不能满足要求的,读者此处可以试一下看看
终端运行:python demo.py --list 2 3 4
得到结果为['2', '3', '4']
,可以看到程序是将每个数据转成str
,然后拼接起来,如果要求最后的结果是int,需要指定type=int
,这样列表中的元素就都是整形了。
如下面这个例子:
parser.add_argument('--list', nargs='+', type=int,
help='<Required> Set flag', default=[1, 2, 3, 4])
args = parser.parse_args()
if __name__ == '__main__':
print(args.list)
这样就既可以在终端中指定,也可以用默认的了。