CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Python 进阶/课时/综合练习
RawBlame
课时目录12 节

Python 进阶

  1. 01Python 进阶地图
  2. 02类型与数据结构
  3. 03OOP 深入
  4. 04函数式特性
  5. 05并发与异步
  6. 06Web 框架
  7. 07包管理与虚拟环境
  8. 08静态类型与校验
  9. 09测试框架
  10. 10代码质量工具
  11. 11算法与数据结构
  12. 12综合练习

综合练习

FastAPI 小模块 + pytest 覆盖。

40 分钟

综合实战:课时统计 API

整合本 track 所学:用 FastAPI + asyncio + pathlib + pytest + pyproject 构建「扫描 drafts 并返回统计 JSON」的小服务,作为毕业项目。复习 python-fundamentals;若扩展为 Agent 工具可对接 ai-agents-essentials;继续在 /roadmaps/python 选进阶节点。

学习目标

  • 完成可运行的 FastAPI 项目并完成基本测试
  • 实践 async 文件扫描、Pydantic 响应模型与错误处理
  • 输出 README 与 pyproject,满足可安装、可部署最小标准

需求说明

  1. GET /tracks/{track}/stats:扫描 content/课程/{track}/drafts/*.md
  2. 返回每课 slug、字符数、行数、是否含代码块(```)
  3. 目录不存在时返回 404;支持 ?min_chars=500 过滤

核心实现 sketch

import asyncio
from pathlib import Path
from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel

app = FastAPI()
CONTENT_ROOT = Path("content/课程")

class LessonStat(BaseModel):
    slug: str
    chars: int
    lines: int
    has_code_block: bool

class TrackStats(BaseModel):
    track: str
    lessons: list[LessonStat]

async def analyze_file(path: Path) -> LessonStat:
    text = await asyncio.to_thread(path.read_text, encoding="utf-8")
    return LessonStat(
        slug=path.stem,
        chars=len(text),
        lines=text.count("\n") + (1 if text else 0),
        has_code_block="```" in text,
    )

@app.get("/tracks/{track}/stats", response_model=TrackStats)
async def track_stats(
    track: str,
    min_chars: int = Query(default=0, ge=0),
) -> TrackStats:
    draft_dir = CONTENT_ROOT / track / "drafts"
    if not draft_dir.is_dir():
        raise HTTPException(404, f"track not found: {track}")
    paths = sorted(draft_dir.glob("*.md"))
    stats = await asyncio.gather(*(analyze_file(p) for p in paths))
    filtered = [s for s in stats if s.chars >= min_chars]
    return TrackStats(track=track, lessons=filtered)

测试要点

def test_track_stats_filters_min_chars(client, tmp_content):
    resp = client.get("/tracks/demo/stats?min_chars=100")
    assert resp.status_code == 200
    data = resp.json()
    assert all(l["chars"] >= 100 for l in data["lessons"])

使用 TestClient + fixture 指向 tmp_path 中的假 drafts。

扩展方向

  • 加 Redis 缓存统计结果
  • 导出 Prometheus metrics
  • 封装为 Agent Tool:get_lesson_stats(track)
  • 练习

    • 完成 API 并通过 pytest + ruff + mypy
    • 写 README:安装、运行、示例 curl
    • 在路线图选定下一门课(如 ai-agents-essentials 或 java-fundamentals)

    小结

    进阶 Python 的验收标准:能独立交付一个小型可维护服务。 恭喜完成 python-advanced-essentials;带着项目经验继续路线图上的下一节点。

    加载本节练习…
    ← 上一课算法与数据结构