You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:57:08