Python 3.8 字符串输入验证if判断逻辑失效问题排查求助
问题描述
- 编写重量转换工具时,if输入校验逻辑始终不通过:即便输入合法的L/K单位标识,也会触发错误提示
- 已尝试使用
strip()等方法清理输入内容,未定位到问题根源
原始代码
print("Convert your weight") while (True): try: raw = float(input("What is your weight?: ")) except ValueError: print("You must enter a number") else: break while (True): try: unit = str.lower(input("Is that pounds'(L)', or kilos'(K)'?: ")) except: print("It must be a letter") else: if unit!= "l" or "k": print("Unit: " + unit) print("You can only input L or K") else: print("Time to send a break") break print ("raw: " + str(raw) + " : " + "unit: " + str(unit))
问题根源
核心bug在单位校验的if判断语句:if unit!= "l" or "k": 是典型的逻辑写法错误,不会按照「判断unit不等于l也不等于k」的预期运行,实际执行逻辑为:
- 优先计算
unit!= "l",得到True/False类型的布尔结果 - 再将第一步的结果和字符串
"k"执行or运算 - Python语法规则中,非空字符串的布尔值永远为True,因此无论输入什么内容,整个if条件的最终结果永远为True,必然触发错误提示。
额外存在两个影响体验的小问题:
- 未对输入的单位字符串做首尾空格清理,用户输入时不小心带的空格、换行符都会导致判定非法
- 使用了无指定异常类型的裸
except,会捕获所有无关异常,不符合编码规范
修复方案
将错误的链式or判断替换为成员判断,同时补全输入清理逻辑,修复后完整代码如下:
print("Convert your weight") while True: try: raw = float(input("What is your weight?: ")) break except ValueError: print("You must enter a number") while True: unit = input("Is that pounds (L), or kilos (K)?: ").lower().strip() if unit not in ("l", "k"): print(f"Unit: {unit}") print("You can only input L or K") else: print("Validation passed") break print(f"raw: {raw} : unit: {unit}")
关键修改点:
- 用
if unit not in ("l", "k")替换原错误判断,直接校验输入是否在合法值范围内,逻辑直白不会出错 - 输入处理时链式调用
.lower().strip(),统一转小写的同时自动清理首尾多余的空格、换行符 - 移除了多余的try捕获(单位输入是字符串类型,不存在类型转换报错场景,无需异常捕获)
- 用f-string替换原字符串拼接写法,代码可读性更高
内容的提问来源于stack exchange,提问作者davetayl
相关产品推荐
相关产品推荐

