Python中如何定义参数数据类型以限制不匹配的非法数据输入
为什么加了类型注解还是不生效
Python属于动态类型语言,你写的参数类型注解(参数后加:类型的写法)默认仅为静态提示信息,仅供给IDE、mypy这类静态类型检查工具做开发阶段的代码分析使用,Python解释器运行代码时不会对这些注解做校验,所以哪怕传入的参数类型不符合预期,程序也能正常运行。
实现运行时类型校验的常用方案
方案1:手动在构造方法中添加校验逻辑
不需要依赖第三方库,原生实现,灵活度最高,可以自定义校验规则和报错信息:
class Checking(BankAccount): def __init__(self, acc_number: int, acc_holder: str, acc_balance: float): # 逐个校验参数类型 if not isinstance(acc_number, int): raise TypeError(f"acc_number需要传入int类型,实际收到{type(acc_number).__name__}类型") if not isinstance(acc_holder, str): raise TypeError(f"acc_holder需要传入str类型,实际收到{type(acc_holder).__name__}类型") if not isinstance(acc_balance, float): # 如果需要支持int自动转float,可以打开下面两行注释 # if isinstance(acc_balance, int): # acc_balance = float(acc_balance) # else: raise TypeError(f"acc_balance需要传入float类型,实际收到{type(acc_balance).__name__}类型") self.acc_num = acc_number self.acc_holder = acc_holder self.acc_balance = acc_balance
当传入不符合类型要求的参数时,会直接抛出TypeError终止运行,避免错误参数传入后续逻辑。
方案2:使用pydantic库实现自动校验
如果不想手写大量校验逻辑,可以使用第三方库pydantic,它会自动根据你写的类型注解做运行时校验,还支持合理的自动类型转换:
首先安装依赖:pip install pydantic
修改代码如下:
from pydantic import BaseModel class Checking(BaseModel, BankAccount): # 直接在类下定义属性和对应类型注解,无需手动写__init__方法 acc_number: int acc_holder: str acc_balance: float # 示例:传入正确参数 random = Checking(acc_number=84829, acc_holder="Roger", acc_balance=637.23) # 示例:如果传入acc_balance为"a637.23"这类不符合类型的参数,运行时会自动抛出校验异常
方案3:开发阶段用静态检查工具提前发现问题
如果不需要运行时报错,只想在开发阶段就排查出类型错误,可以安装mypy工具:pip install mypy
写完代码后执行mypy 你的代码文件名.py,它会自动扫描出所有类型不匹配的问题,不需要修改运行时代码就能提前发现bug。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

