模块 4 - 实用 Python · 第 18 课
Type Hint、Dataclass 与测试基础
用类型提示、dataclass 和小型断言提高实验代码的可读性与可信度。
类型提示是文档
def mean(values: list[float]) -> float:
return sum(values) / len(values)
Python 默认不会强制执行提示,但编辑器和静态工具可以据此发现错误。提示应表达真实契约,不要为了消除警告而胡乱使用 Any。
dataclass 表达数据记录
from dataclasses import dataclass
@dataclass
class RunConfig:
learning_rate: float = 1e-3
batch_size: int = 64
dataclass 自动生成初始化和表示方法,适合配置或指标记录,不是替代所有类的魔法工具。
最小测试
def clip(value: float) -> float:
return max(0.0, min(value, 1.0))
assert clip(1.2) == 1.0
assert clip(-0.1) == 0.0
pytest 可以把这些断言组织成测试函数。创建 test_metrics.py:
def clip(value: float) -> float:
return max(0.0, min(value, 1.0))
def test_clip_bounds():
assert clip(1.2) == 1.0
assert clip(-0.1) == 0.0
在项目目录运行 pytest,pytest 会发现并执行 test_ 开头的函数。本课只需理解“给定输入,检查预期输出”;不深入 fixture 或插件。为 mean() 写两个正常测试和一个空列表异常测试,能尽早发现数据处理问题。
分级练习
★ 基础
给 clip() 增加一个边界值测试。
★★ 应用
为 dataclass 配置写一个测试,确认默认 batch size 正确。
★★★ 综合
写一个 mean() 和三个 pytest 测试,覆盖正常值、单元素和空列表;为异常情况写出明确的 pytest.raises 断言。
综合练习参考答案
```python import pytest def mean(values: list[float]) -> float: if not values: raise ValueError("values must not be empty") return sum(values) / len(values) def test_mean_normal(): assert mean([1.0, 3.0]) == 2.0 def test_mean_single(): assert mean([0.5]) == 0.5 def test_mean_empty(): with pytest.raises(ValueError, match="must not be empty"): mean([]) ``` 运行 `pytest` 后,三个测试都应通过。 第 18 课 学习进度仅保存在当前浏览器。