python输入参数校验是防御式编程的核心,需在函数入口明确契约、快速失败、清晰反馈;应优先校验类型与存在性(如isinstance+none判断),再校验范围及业务规则(如年龄非负、端口有效)。

Python输入参数校验是防御式编程的核心实践,不是“可有可无”的补充,而是防止运行时崩溃、逻辑错乱和安全漏洞的第一道防线。关键不在于堆砌检查,而在于在函数入口处明确契约、快速失败、给出清晰反馈。
类型与存在性校验:用isinstance + None判断守住底线
很多错误源于传入了None、空字符串、错误类型(如把list当str)却未及时拦截。不要依赖后续逻辑“自己处理”,应在开头就确认。
- 对必填参数,先检查是否为None或空值:if x is None: raise ValueError("x cannot be None")
- 对类型敏感参数,用isinstance(x, expected_type)而非type(x) == expected_type(支持继承)
- 字符串建议同时校验isinstance(x, str) and x.strip(),避免传入空白串引发下游异常
范围与业务规则校验:把领域约束写进函数签名
参数合法不仅看类型,更要看语义。比如年龄不能为负、端口号应在1–65535、文件路径需存在且可读——这些不是“额外工作”,而是函数职责的一部分。
- 数值范围:用if not (0
- 枚举/有限取值:提前定义ALLOWED_MODES = {"fast", "safe", "debug"},再校验if mode not in ALLOWED_MODES
- 路径/文件类:用os.path.exists(path)和os.access(path, os.R_OK)做轻量预检(注意竞态条件,仅作提示性校验)
使用装饰器统一校验逻辑:避免重复代码
多个函数有相似校验需求(如所有API接口都要验证token、用户权限),可封装成装饰器,保持主逻辑干净。
立即学习“Python免费学习笔记(深入)”;
- 简单校验装饰器示例:@validate_args(token=str, user_id=int, role={"admin","user"})
- 内部自动调用isinstance和in检查,任一失败抛出TypeError或ValueError
- 生产环境建议结合typing.Annotated + 自定义__get_validators__(Pydantic v2+风格),兼顾类型提示与运行时校验
错误处理要具体、可操作、不暴露内部细节
抛出异常不是目的,帮助调用方快速定位问题是关键。避免泛泛的Exception("Invalid input")。
- 异常信息包含参数名、实际值、期望条件,例如:f"timeout must be positive number, got {timeout}"
- 优先用内置异常:类型错用TypeError,值不合业务规则用ValueError,权限问题用PermissionError
- 不打印traceback给终端用户;日志中记录完整上下文,但对外只返回简洁友好的错误消息











