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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:50:14