Python argparse可选参数无效值与空值处理方案咨询
argparse 可选参数校验与空值跳过实现方案
直接利用argparse原生能力即可实现需求,不需要额外编写冗余的参数长度判断逻辑,修改后的可运行代码如下:
import argparse def main(): parser = argparse.ArgumentParser() # 配置choices指定合法取值范围,传入非法值时argparse会自动拦截并抛出标准错误 parser.add_argument('-C','--Chk', type=str, choices=['compo1', 'compo2'], help='Choose arg') parser.add_argument('-R','--ReC', type=str, choices=['recompo'], help='Choose arg') args = parser.parse_args() # 先判断参数是否传入,未传入时参数值为None,直接跳过对应分支 if args.Chk is not None: if args.Chk == 'compo1': print('This is comp1') elif args.Chk == 'compo2': print('This is comp2') if args.ReC is not None: if args.ReC == 'recompo': print('This is second test') if __name__=='__main__': main()
逻辑说明
- 非法值校验:
add_argument的choices参数接收一个可迭代对象,定义该参数允许传入的所有值。如果用户传入的值不在合法范围内,argparse会自动终止程序,打印明确的错误提示,告知用户合法的可选值,不需要手动抛出ArgumentTypeError。你之前写的len(args)判断逻辑不生效,因为vars(parser.parse_args())返回的字典长度等于你定义的参数总个数,和用户传入的参数值长度没有关联。 - 未传参跳过分支:可选参数未被用户传入时,默认值为
None,在执行分支逻辑前先判断参数值是否不为None,再执行后续判断即可,不会出现未传参时误打印“参数不存在”提示的问题。
运行效果
- 不传任何参数启动程序:无任何输出,符合预期
- 传入
-C compo1:输出This is comp1 - 传入
-C 非法值:程序自动报错,提示argument -C/--Chk: invalid choice: '非法值' (choose from 'compo1', 'compo2') - 传入
-R recompo:输出This is second test - 传入
-R 非法值:程序自动报错,提示对应合法取值范围
内容的提问来源于stack exchange,提问作者newstudent
相关产品推荐
相关产品推荐

