Python用户输入列表的函数验证:新手类校验异常代码不生效求助
问题排查及修复方案
核心问题
你写的validate_inputs校验方法没有被调用,__init__初始化方法中直接把入参赋值给了实例属性,校验逻辑全程没有运行,自然不会生效。
其他可优化的逻辑问题
- 校验顺序不合理:当前先执行
zip再判断列表长度,若三个列表长度不一致,zip会提前生成截断后的迭代器,属于无意义计算,应该先做长度校验再遍历内容 - 异常类型使用不规范:校验数值为负的场景直接抛出基类
Exception,应该抛出更具体的ValueError,方便上层代码针对性捕获 - 逻辑描述与实现不一致:注释写的是要求「正整数」,但当前判断条件是
pack < 0,会允许0值传入,如果要求严格正整数,需要改成pack <= 0 - 校验逻辑与属性赋值脱节:就算调用了校验方法,校验通过后没有将合法值和实例属性绑定的逻辑,仍然可能把非法值存入实例
修复后可直接运行的代码
class Game: def __init__(self, packs_purchase, dice_purchase, board_games_purchase): # 初始化时先执行校验,校验不通过直接抛异常,不会执行后续赋值逻辑 self.validate_inputs(packs_purchase, dice_purchase, board_games_purchase) self.packs_purchase = packs_purchase self.dice_purchase = dice_purchase self.board_games_purchase = board_games_purchase def validate_inputs(self, packs_purchase, dice_purchase, board_games_purchase): # 先校验三个输入列表长度一致 if not len(packs_purchase) == len(dice_purchase) == len(board_games_purchase): raise ValueError("Invalid input- customer order size must be equal") all_inputs = zip(packs_purchase, dice_purchase, board_games_purchase) for pack, dice, board in all_inputs: # 校验每个元素都是整数 if not isinstance(pack, int) or not isinstance(dice, int) or not isinstance(board, int): raise TypeError("Invalid input- please check input must be integer") # 校验数值非负,若要求严格正整数,把<0改成<=0即可 if pack < 0 or dice < 0 or board < 0: raise ValueError("Invalid input- all inputs must be positive integer")
修复后只要实例化Game类时传入非法参数,就会触发对应异常,校验逻辑正常生效。
内容的提问来源于stack exchange,提问作者Vida Maleki
相关产品推荐
相关产品推荐

