Python三层嵌套if条件全部匹配却无法进入最内层执行assert语句求助
代码无法进入内层if块的问题原因
核心问题1:日期字符串直接比较逻辑错误
Python中字符串的大小比较是逐字符按ASCII码值对比,你使用的DD-MM-YYYY格式的日期字符串直接比较时,会优先对比「日」的数值,再依次对比月、年,和实际日期的先后判断逻辑完全不符:
- 测试数据中
exp_date = '30-10-2021',context.end_date = '12-12-2021',字符串比较时第一个字符'3'的ASCII码远大于'1',所以exp_date < context.end_date直接返回False,第一层if判断就不满足,自然不会进入内层代码。 - 第二层
reg_date > '01-09-2018'的判断也存在相同隐患,例如'01-10-2018'字符串小于'02-09-2018',但实际10月的日期晚于9月,判断结果完全错误。
核心问题2:可能存在类型不匹配
如果入参man_yr是字符串类型的'2018',而context.expctd_manu_year是整数类型的2018,Python中'2018' == 2018会返回False,也会导致第三层if判断不通过。
修复方案
将所有日期转换为datetime类型后再比较,同时统一对比变量的类型,参考修改后的代码:
from datetime import datetime # 定义对应DD-MM-YYYY格式的日期解析规则 DATE_FORMAT = "%d-%m-%Y" def step_impl(context, status, exp_date, owner, reg_date, man_yr, vchl_make, vchl_code): if datetime.strptime(exp_date, DATE_FORMAT) < datetime.strptime(context.end_date, DATE_FORMAT): if datetime.strptime(reg_date, DATE_FORMAT) > datetime.strptime('01-09-2018', DATE_FORMAT): if int(man_yr) == int(context.expctd_manu_year): assert int(context.json_response[0]['base_premium']) > 1 assert int(context.json_response[0]['total_premium']) > 1 assert int(context.json_response[0]['tax']) > 1 print(context.json_response[0]["tax"])
冗余的
else: pass可以直接删除,Python中没有else分支时默认不执行任何操作,不影响逻辑。
内容的提问来源于stack exchange,提问作者Apratim Chaudhuri
相关产品推荐
相关产品推荐

