使用argparse时遇到TypeError: 'NoneType' object is not iterable错误的解决咨询
使用argparse时遇到TypeError: 'NoneType' object is not iterable错误的解决咨询
嘿,我来帮你搞定这个问题~先看看你的代码:
def getOptions(): parser = argparse.ArgumentParser(description='Parses Command.') parser.add_argument('-t','--train',nargs='+',help='Training data directories.') parser.add_argument('-i','--iteration',type=int,nargs='+',help='Number of iteration.') options = parser.parse_args() return options
你遇到的TypeError: 'NoneType' object is not iterable错误,核心原因是:当你在命令行没有传入-t/--train参数时,options.train的值会是None,而不是你以为的空列表。这时候直接用for循环遍历None自然就报错了。
下面给你几个实用的解决思路:
给参数设置默认空列表
修改add_argument时加上default=[],这样即使用户没传-t参数,options.train也会是一个空列表,循环时就不会触发错误了:parser.add_argument('-t','--train',nargs='+',help='Training data directories.', default=[])遍历前先判断是否为None
如果你不想强制用户传参数,也可以在循环前做个非空判断,避免直接遍历None:options = getOptions() if options.train is not None: for train_dir in options.train: # 这里写你的处理逻辑 print(f"处理训练目录:{train_dir}") else: print("请传入训练数据目录,使用-t/--train参数")强制用户必须传入该参数
如果-t是程序运行的必填参数,那可以直接给add_argument加上required=True,这样用户没传参数时,argparse会自动抛出错误并提示用户,从根源上避免None的出现:parser.add_argument('-t','--train',nargs='+',help='Training data directories.', required=True)
另外你提到vars没用,其实vars(options)只是把argparse.Namespace对象转成了字典,比如vars(options)['train'],但如果用户没传参数,这个值依然是None,所以核心还是要处理None的情况,上面的方法同样适用哦~
备注:内容来源于stack exchange,提问作者Ιωάννα Χατζαντουριάν
相关产品推荐
相关产品推荐

