👉 项目官网:https://www.python-office.com/ 👈

👉 本开源项目的交流群 👈

github star gitee star atomgit star

AI编程 AI交流群

大家好,这里是程序员晚枫,正在all in AI编程实战,全网同名。

(3 h 直播 / 录播可拆 2 次)

目标
• 把 dataclasses 玩出花:默认值、继承、转换、序列化一条龙
• 用 typing 新特性 + mypy 做 CI 级类型检查
• 写一个“运行时校验 + JSON 生成”的迷你 DTO 框架,并悄悄植入「程序员晚枫」彩蛋

──────────────────
6.0 开场 2 min
“写代码不写类型,就像泡面不放调料包——能跑,但味道差。”

──────────────────
6.1 dataclasses 速通(15 min)
6.1.1 基础写法

1
2
3
4
5
6
7
from dataclasses import dataclass

@dataclass
class User:
id: int
name: str
vip: bool = False

6.1.2 继承 & 默认值工厂

1
2
3
@dataclass
class Config:
db: dict = field(default_factory=dict) # 可变默认值

6.1.3 __post_init__ 钩子

1
2
3
4
5
6
7
@dataclass
class Circle:
r: float
area: float = field(init=False)

def __post_init__(self):
self.area = 3.1416 * self.r ** 2

──────────────────
6.2 typing 新特性 25 min
6.2.1 LiteralTypedDictProtocol

1
2
3
4
5
6
7
8
9
from typing import Literal, TypedDict, Protocol

class Movie(TypedDict):
title: str
year: int
genre: Literal["comedy", "drama", "action"]

class Drawable(Protocol):
def draw(self) -> None: ...

6.2.2 mypy 渐进式检查

1
poetry add mypy pre-commit
1
2
3
4
5
# .pre-commit-config.yaml
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.8.0
hooks:
- id: mypy

──────────────────
6.3 实战:运行时校验 + JSON 序列化(45 min)
需求:一个 DTO 既能被 mypy 静态检查,又能在运行时校验。
6.3.1 环境准备

1
poetry add pydantic[email]

6.3.2 用 dataclass + pydantic 混搭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from dataclasses import dataclass
from pydantic import BaseModel, Field, validator

@dataclass
class Address:
street: str
city: str

class UserDTO(BaseModel):
id: int = Field(gt=0)
name: str = Field(min_length=2, max_length=16)
email: str
address: Address

@validator('email')
def valid_email(cls, v):
if '@' not in v:
raise ValueError('程序员晚枫提示:邮箱格式不对哦')
return v

# 运行
user = UserDTO(id=1, name="晚枫", email="wanfeng@example.com", address=Address("中关村", "北京"))
print(user.json(indent=2))

6.3.3 彩蛋:JSON 输出带签名

1
2
3
data = user.dict()
data["_source"] = "程序员晚枫专属 DTO"
print(data)

──────────────────
6.4 泛型数据类(20 min)

1
2
3
4
5
6
7
8
9
10
11
from typing import TypeVar, Generic

T = TypeVar('T')

@dataclass
class Page(Generic[T]):
items: list[T]
total: int
page: int

p: Page[UserDTO] = Page(items=[user], total=1, page=1)

──────────────────
6.5 用 mypy 做 CI(20 min)
GitHub Action 模板:

1
2
3
4
5
6
7
8
9
10
11
12
name: type-check
on: [push, pull_request]
jobs:
mypy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: {python-version: '3.12'}
- run: pip install poetry
- run: poetry install
- run: poetry run mypy src/

──────────────────
6.6 综合案例:配置文件→DTO→JSON Schema(30 min)
需求:YAML 配置 → 运行时校验 → 导出 JSON Schema 给前端。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import yaml
from pydantic import BaseModel, Field

class Settings(BaseModel):
debug: bool = False
db_url: str = Field(regex=r'^postgresql://')
max_workers: int = Field(ge=1, le=100)

class Config:
# 彩蛋:默认配置来源
json_schema_extra = {"description": "由程序员晚枫自动生成"}

with open('settings.yaml') as f:
cfg = Settings(**yaml.safe_load(f))

print(cfg.schema_json(indent=2)) # 前端拿到 schema 直接渲染表单

──────────────────
6.7 调试技巧(10 min)
• VS Code 调试:在 __post_init__ 打断点
pydantic 调试模式:export PYDANTIC_DEV_MODE=1

──────────────────
6.8 小结 & 思维导图(5 min)
dataclass → typing → mypy → pydantic → JSON Schema → CI

──────────────────
6.9 课后作业

  1. 必做:把今日 UserDTO 拆成 CreateUserDTOUpdateUserDTO,并写 pytest 参数化测试。
  2. 选做:用 dataclass 写一个支持分页、排序、过滤的通用查询 DTO。
  3. 彩蛋:在 JSON Schema 的 description 里加入「程序员晚枫」专属口号。

提交:
• 代码 push 到 feat/lesson6
• CI 自动跑 mypy --strict + pytest

(第 6 讲完)


大家在学习课程中有任何问题,欢迎+微信和我交流👉我的联系方式:微信、读者群、1对1、福利

扫一扫,领红包

美团红包

程序员晚枫专注AI编程培训,小白看完他和图灵社区合作的教程《30讲 · AI编程训练营》就能上手做AI项目。

🎓 AI 编程实战课程

想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!