【学习心得】Python的TypedDict(简介)

TypeDict (Python中类型安全的字典)是Python 3.8引入的类型提示工具,用于定义具有固定键集合各键对应特定类型的字典对象。它允许你为字典的每个键指定值的类型,使静态类型检查器能够更准确地验证字典的使用方式。其核心特点如下:

特点 说明
字典的键是预定义的字符串 必须提前定义好所有键的名称和类型
每个键都有对应的值类型 每个键的值都有明确的类型约束
支持必需字段和可选字段 可以定义哪些字段必须提供,哪些可选
运行时不强制类型检查 Python运行时不验证类型,但mypy等工具可以静态检查

一、基本用法

1、定义TypedDict

  • Python 3.8+ 直接使用 from typing import TypedDict
python 复制代码
from typing import TypedDict

class User(TypedDict):
    name: str
    age: int
    is_active: bool

# 创建符合TypedDict定义的字典(在注解中声明)
user: User = {
    "name": "张三",
    "age": 30,
    "is_active": True
}

2、在函数中使用

python 复制代码
def get_user_info(user: User) -> str:
    return f"用户名:{user['name']},年龄:{user['age']}"

print(get_user_info(user))  # 输出:用户名:张三,年龄:30

3、可选字段处理

(1)使用tool=False

python 复制代码
class PartialUser(TypedDict, total=False):
    name: str
    age: int
    email: str

# 所有字段都是可选的
partial_user: PartialUser = {
    "name": "李四"
    # age和email可以不提供
}

(2)使用NotRequired

python 复制代码
from typing_extensions import NotRequired

class UserProfile(TypedDict):
    name: str                    # 必需字段
    age: int                     # 必需字段
    email: NotRequired[str]      # 可选字段
    phone: NotRequired[str]      # 可选字段

# 可以不包含可选字段
profile1: UserProfile = {
    "name": "王五",
    "age": 25
}

# 也可以包含可选字段
profile2: UserProfile = {
    "name": "赵六",
    "age": 28,
    "email": "zhaoliu@example.com"
}

4、注意事项

(1)不强制校验

python 复制代码
# 下面这段代码在运行时不会报错
# 但mypy等静态检查器会发出警告
user: User = {
    "name": "错误",  # 这是str,没问题
    "age": "三十",    # 应该是int,类型错误!
    "is_active": True
}

(2)不能在其中定义方法

python 复制代码
# TypedDict只能定义键的类型,不能定义方法
class BadExample(TypedDict):
    name: str
    def greet(self) -> str:  # 错误!不允许方法
        return "Hello"

二、常见应用场景

1、校验API的响应格式

python 复制代码
class APIResponse(TypedDict):
    success: bool
    data: NotRequired[list[dict]]
    error: NotRequired[str]

def process_response(response: APIResponse) -> None:
    if response["success"]:
        if "data" in response:
            print(f"处理数据:{response['data']}")
    else:
        if "error" in response:
            print(f"错误信息:{response['error']}")

# 使用示例
success_resp: APIResponse = {
    "success": True,
    "data": [{"id": 1, "name": "商品1"}]
}

error_resp: APIResponse = {
    "success": False,
    "error": "认证失败"
}

2、函数结构化返回值

python 复制代码
class AnalysisResult(TypedDict):
    status: str
    score: float
    details: dict

def analyze_text(text: str) -> AnalysisResult:
    # 模拟分析逻辑
    return {
        "status": "completed",
        "score": 0.85,
        "details": {"length": len(text), "words": len(text.split())}
    }

result = analyze_text("这是一段测试文本")
# result的类型被明确为AnalysisResult,IDE可以提供智能提示
相关推荐
cxhello6 分钟前
消费者活着、心跳正常、日志干净,但它七天没拉过一条消息
python·kafka
砚底藏山河9 分钟前
【量化纯GET实战 #11】移动均线 MA:5 日 20 日 60 日怎么算怎么用
java·python·金融·maven
小吴学不废Java13 分钟前
Python 基础语法
开发语言·python
weixin_4334176714 分钟前
阿里视频大模型wan2.7‑t2v,可以生成视频
人工智能·python·音视频
sukioe28 分钟前
一张图、两把锁:AI 物流履约平台的确定性边界设计
人工智能·python·ai·langchain
布莱克60537 分钟前
队列详解:定义、分类、应用场景及与栈的区别(C/C++ 代码讲解)
c语言·开发语言·c++·队列
CPETW37 分钟前
USB TO I2C_(Excel)_Scan ---- 1000KHz总线速率测试_A
c语言·开发语言·网络·科技·单片机
2601_9622035142 分钟前
【SpringBoot3】面向切面 AspectJ AOP 使用详解
开发语言·前端·python
程序员大雄学编程1 小时前
微积分43. 无穷积分入门:从概念到Python实战可视化
开发语言·python·学习·微积分
何以解忧,唯有..1 小时前
LangChain 中 Pydantic 格式输出:结构化输出的完整指南
java·开发语言·langchain