Python 3.10.8中TypedDict未触发TypeError问题求助
问题解答
TypedDict未触发TypeError的原因
TypedDict 是Python的静态类型提示工具,仅用于给类型检查器(如mypy、pyright)提供类型约束信息,Python解释器在运行时完全忽略这些类型注解。所以哪怕传入不符合结构的字典,运行时也不会抛出TypeError——只有用静态类型检查工具扫描代码时,才会提示类型不匹配的问题。
示例验证:
from typing import TypedDict class User(TypedDict): name: str age: int # 运行时不会报错,但mypy会提示类型错误 def print_user(user: User): print(user) print_user({"name": "Alice", "age": "25"}) # age为字符串,不符合TypedDict定义,但运行正常
用BaseModel实现参数即时校验
要实现函数参数传入时的即时运行时校验,直接使用Pydantic的BaseModel即可,Pydantic会在实例化或解析数据时自动校验字段类型和结构,不符合要求会立刻抛出ValidationError。
方案1:直接将参数声明为BaseModel子类
from pydantic import BaseModel, ValidationError class User(BaseModel): name: str age: int def example_01(user: User): print(user.name, user.age) # 传入符合要求的实例或字典都可自动解析校验 example_01(User(name="Bob", age=30)) example_01({"name": "Charlie", "age": 28}) # 传入不符合的参数会立即抛出ValidationError try: example_01({"name": "Dave", "age": "35"}) except ValidationError as e: print(e)
方案2:用装饰器简化字典参数校验(可选)
如果希望函数直接接收字典参数但自动完成校验,可以写一个轻量装饰器:
from functools import wraps from pydantic import BaseModel, ValidationError def validate_model(model: type[BaseModel]): def decorator(func): @wraps(func) def wrapper(data, *args, **kwargs): validated = model(**data) return func(validated, *args, **kwargs) return wrapper return decorator class User(BaseModel): name: str age: int @validate_model(User) def example_01(user: User): print(user.name, user.age) # 直接传字典会自动完成校验 example_01({"name": "Eve", "age": 22}) # 不符合的参数会立即触发异常 example_01({"name": "Frank", "age": "30"})
通过以上方式,调用example_01时,参数会在进入函数体之前完成校验,不符合约束的输入会直接抛出异常。
内容的提问来源于stack exchange,提问作者Hung Swifty
相关产品推荐
相关产品推荐

