<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Qzai&#39;s Blog</title>
        <link>https://example.com/</link>
        <description>Always remember that your present situation is not your final destination. The best is yet to come.</description>
        <generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>ixiaoqiang0011@gmail.com (Qzai)</managingEditor>
            <webMaster>ixiaoqiang0011@gmail.com (Qzai)</webMaster><lastBuildDate>Thu, 30 Jul 2026 00:00:00 &#43;0000</lastBuildDate>
            <atom:link href="https://example.com/index.xml" rel="self" type="application/rss+xml" />
        <item>
    <title>GitHub 每日热门项目盘点：AI Agent 体系化与基础设施爆发期</title>
    <link>https://example.com/posts/ai/github-2026-07-30/</link>
    <pubDate>Thu, 30 Jul 2026 00:00:00 &#43;0000</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/ai/github-2026-07-30/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="https://img.zhaojq.top/20260730115941380.png" referrerpolicy="no-referrer">
            </div>盘点 2026 年 7 月 30 日 GitHub 热门项目，覆盖 AI 渗透测试、Agentic 视频制作、代码知识图谱、价值投资研究框架、LLM 股票分析、AI 网站克隆等方向。AI 相关占比 80%，呈现 Agent 体系化、技能模块化、Token 精益化、垂直场景深化四大趋势。]]></description>
</item>
<item>
    <title>每日 AI 资讯 | 2026-07-30：Kimi K3 全量开源、Anthropic 2人11天重写50万行代码、具身智能进入部署元年</title>
    <link>https://example.com/posts/ainews/%E8%B5%84%E8%AE%AF-2026-07-30/</link>
    <pubDate>Thu, 30 Jul 2026 00:00:00 &#43;0000</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/ainews/%E8%B5%84%E8%AE%AF-2026-07-30/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="https://img.zhaojq.top/20260730065705342.png" referrerpolicy="no-referrer">
            </div>今日AI领域两大主线：AI Coding 加速向"Agent 自主+小团队"演进，Anthropic 曝光两人 11 天 16.5 万美元 token 完成 50 万行代码迁移；具身智能从 WAIC 演示到工业部署，WAIC 首次独立成馆、国内首个"飞檐走壁"特种机器人亮相。同时 Kimi K3 以 2.8 万亿参数成为全球最大开源大模型。]]></description>
</item>
<item>
    <title>人类的&#34;自知之明&#34;从何而来：牛津跨物种研究揭示元认知的进化起源</title>
    <link>https://example.com/posts/awareness/%E8%AE%A4%E7%9F%A5-2026-07-30/</link>
    <pubDate>Thu, 30 Jul 2026 00:00:00 &#43;0000</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/awareness/%E8%AE%A4%E7%9F%A5-2026-07-30/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="https://img.zhaojq.top/20260730065657672.png" referrerpolicy="no-referrer">
            </div>牛津大学2026年发表于Nature Human Behaviour的研究证实，猕猴同样具备前瞻性元认知能力，但人类大脑把这种"自我审视"功能从"双核分布式"升级成了"单核高度整合"，并通过额极皮层的深度连接演化出了更强的自我反省与未来规划能力。]]></description>
</item>
<item>
    <title>AI 资讯日报｜2026-07-29：AI Coding 进入 Agent 协作阶段，具身智能走进生产力</title>
    <link>https://example.com/posts/ainews/%E8%B5%84%E8%AE%AF-2026-07-29/</link>
    <pubDate>Wed, 29 Jul 2026 00:00:00 &#43;0000</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/ainews/%E8%B5%84%E8%AE%AF-2026-07-29/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="https://img.zhaojq.top/20260729200223759.png" referrerpolicy="no-referrer">
            </div>腾讯云发布业内首个 AI Native Git 产品 CodeBuddy NPC；Anthropic 用 Claude Code 12 天完成 50 万行代码迁移；具身智能告别剧本式演示，WAIC 上的机器人开始真正干活；中国具身智能产业上半年融资 460 亿元，量产基地密集落地。]]></description>
</item>
<item>
    <title>认知觉醒：人与人真正的差距，从来都不是智商</title>
    <link>https://example.com/posts/awareness/%E8%AE%A4%E7%9F%A5-2026-07-29/</link>
    <pubDate>Wed, 29 Jul 2026 00:00:00 &#43;0000</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/awareness/%E8%AE%A4%E7%9F%A5-2026-07-29/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="https://img.zhaojq.top/20260729202212063.png" referrerpolicy="no-referrer">
            </div>北京大学纵向追踪近万人研究揭示：智商仅能解释16%的人生差距，后天认知觉醒影响权重高达74%。本文拆解认知升级的底层逻辑、四大思维陷阱与落地四步法。]]></description>
</item>
<item>
    <title>218 篇文章迁移血泪史：一个 AI 助手的翻车与自救</title>
    <link>https://example.com/posts/ai/ai-codex%E5%8D%9A%E5%AE%A2%E8%BF%81%E7%A7%BB/</link>
    <pubDate>Mon, 27 Jul 2026 12:00:00 &#43;0800</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/ai/ai-codex%E5%8D%9A%E5%AE%A2%E8%BF%81%E7%A7%BB/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/ai-codex%e5%8d%9a%e5%ae%a2%e8%bf%81%e7%a7%bb-poster.svg" referrerpolicy="no-referrer">
            </div>从旧博客到 Hugo LoveIt 主题的全量迁移记录，含翻车、填坑、bug 修复全过程]]></description>
</item>
<item>
    <title>当 Hermes Agent 偷走了你的 node</title>
    <link>https://example.com/posts/ai/ai-hermes%E7%A7%81%E6%9C%89node/</link>
    <pubDate>Sun, 26 Jul 2026 10:00:00 &#43;0800</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/ai/ai-hermes%E7%A7%81%E6%9C%89node/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/ai-hermes%e7%a7%81%e6%9c%89node-poster.svg" referrerpolicy="no-referrer">
            </div>当 Hermes Agent 偷走了你的 node]]></description>
</item>
<item>
    <title>用 Codex 建站：一次 AI 协作搭建 Hugo 博客的全程记录</title>
    <link>https://example.com/posts/ai/ai-codex%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%99/</link>
    <pubDate>Sat, 25 Jul 2026 18:00:00 &#43;0800</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/ai/ai-codex%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%99/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/images/ai-codex%e5%8d%9a%e5%ae%a2%e5%bb%ba%e7%ab%99-poster.svg" referrerpolicy="no-referrer">
            </div><p>今年夏天，我用了一个不太常规的方式搭建了这个博客——通过 Codex（GPT-5）全程对话协作，从初始化到配置、UI 打磨、再到 Git 版本管理，每一步都是人与 AI 共同完成的。</p>]]></description>
</item>
<item>
    <title>Python 学习路线与资源</title>
    <link>https://example.com/posts/language/python-55-python%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF%E4%B8%8E%E8%B5%84%E6%BA%90/</link>
    <pubDate>Wed, 31 Dec 2025 00:00:00 &#43;0000</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/language/python-55-python%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF%E4%B8%8E%E8%B5%84%E6%BA%90/</guid>
    <description><![CDATA[<p><strong>学习目标</strong>：梳理 Python 进阶学习路线，推荐优质书籍、文档、社区与开源项目，为持续成长指明方向。</p>
<hr>
<h2 id="1-学习路线总览">1. 学习路线总览</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>入门基础          →  进阶提升          →  专业方向
┌─────────┐       ┌─────────┐         ┌──────────┐
│ 语法基础 │       │ 面向对象 │         │ Web 开发  │
│ 数据类型 │       │ 装饰器   │         │ 数据分析  │
│ 流程控制 │  ──→  │ 生成器   │   ──→   │ 自动化运维│
│ 函数     │       │ 并发编程 │         │ 机器学习  │
│ 文件IO   │       │ 标准库   │         │ 爬虫     │
└─────────┘       └─────────┘         └──────────┘</code></pre></div>
<h3 id="11-分阶段路线">1.1 分阶段路线</h3>
<table>
	<thead>
			<tr>
					<th>阶段</th>
					<th>目标</th>
					<th>对应教程</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>入门（1-2 月）</td>
					<td>掌握语法、能写脚本</td>
					<td>第 1-8 篇（基础语法 + 函数）</td>
			</tr>
			<tr>
					<td>进阶（2-3 月）</td>
					<td>理解 OOP、装饰器、并发</td>
					<td>第 9-37 篇（数据结构到并发）</td>
			</tr>
			<tr>
					<td>框架（1-2 月）</td>
					<td>掌握 Web 开发</td>
					<td>第 38-43 篇（网络与 Web 框架）</td>
			</tr>
			<tr>
					<td>工程（1 月）</td>
					<td>规范化开发</td>
					<td>第 44-49 篇（工具与规范）</td>
			</tr>
			<tr>
					<td>实战（持续）</td>
					<td>独立完成项目</td>
					<td>第 50-55 篇（综合实战）</td>
			</tr>
	</tbody>
</table>
<hr>
<h2 id="2-核心知识图谱">2. 核心知识图谱</h2>
<h3 id="21-必须扎实掌握">2.1 必须扎实掌握</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>语言核心：
├── 数据类型（list / dict / set / tuple / str）
├── 控制流（if / for / while / break / continue）
├── 函数（参数 / 返回值 / 作用域 / 闭包）
├── 面向对象（类 / 继承 / 多态 / 魔术方法）
├── 异常处理（try/except/finally / 自定义异常）
├── 文件操作（读写 / 上下文管理器）
├── 模块与包（import / __init__.py / 相对导入）
└── 迭代协议（迭代器 / 生成器 / yield）</code></pre></div>
<h3 id="22-进阶必备">2.2 进阶必备</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>高级特性：
├── 装饰器（函数装饰器 / 类装饰器 / 带参数）
├── 上下文管理器（__enter__ / __exit__ / contextlib）
├── 描述符（__get__ / __set__ / __delete__）
├── 元类（type / __init_subclass__ / metaclass）
├── 反射（getattr / hasattr / __getattr__）
├── 类型提示（typing / Generic / Protocol）
└── 数据类（dataclass / pydantic）</code></pre></div>
<h3 id="23-并发编程">2.3 并发编程</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>并发模型：
├── 多线程（threading / GIL / 线程池）
├── 多进程（multiprocessing / 进程池 / 进程通信）
├── 异步 IO（asyncio / await / Task / 事件循环）
└── 并发工具（concurrent.futures / queue / Lock）</code></pre></div>
<hr>
<h2 id="3-专业方向选择">3. 专业方向选择</h2>
<h3 id="31-web-后端开发">3.1 Web 后端开发</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>技术栈：
├── 框架：FastAPI（推荐）/ Django / Flask
├── 数据库：PostgreSQL / MySQL + SQLAlchemy
├── 缓存：Redis
├   消息队列：Celery + RabbitMQ
├── 部署：Docker + Gunicorn + Nginx
└── 监控：Prometheus + Grafana

进阶路线：
1. 掌握一个框架（FastAPI）
2. 学习数据库设计与 ORM
3. 理解 RESTful / GraphQL API 设计
4. 学习认证授权（JWT / OAuth2）
5. 实践微服务架构</code></pre></div>
<h3 id="32-数据分析与科学计算">3.2 数据分析与科学计算</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>技术栈：
├── 核心：NumPy / Pandas
├── 可视化：Matplotlib / Seaborn / Plotly
├── 机器学习：Scikit-learn
├   深度学习：PyTorch / TensorFlow
├── 数据处理：Jupyter Notebook
└── 大数据：PySpark / Dask

进阶路线：
1. 熟练 Pandas 数据操作
2. 掌握统计基础与数据可视化
3. 学习 Scikit-learn 经典算法
4. 深入 PyTorch 深度学习
5. 实践端到端数据项目</code></pre></div>
<h3 id="33-自动化与运维">3.3 自动化与运维</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>技术栈：
├── 脚本：Python 标准库 / Click / Typer
├── 自动化：Selenium / Playwright
├   运维：Ansible / Fabric
├── 定时任务：APScheduler / Celery Beat
├── 监控：psutil / logging
└── 配置管理：pydantic-settings</code></pre></div>
<h3 id="34-爬虫与数据采集">3.4 爬虫与数据采集</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>技术栈：
├── 请求：requests / httpx / aiohttp
├── 解析：BeautifulSoup / lxml / parsel
├── 框架：Scrapy
├   动态页面：Playwright / Selenium
├── 反爬：代理池 / 验证码识别 / 指纹伪装
└── 存储：SQLite / MongoDB / Elasticsearch</code></pre></div>
<hr>
<h2 id="4-推荐书籍">4. 推荐书籍</h2>
<h3 id="41-入门到进阶">4.1 入门到进阶</h3>
<table>
	<thead>
			<tr>
					<th>书名</th>
					<th>难度</th>
					<th>重点</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>《Python 编程：从入门到实践》</td>
					<td>入门</td>
					<td>项目驱动，适合零基础</td>
			</tr>
			<tr>
					<td>《流畅的 Python》</td>
					<td>中高级</td>
					<td>深入语言特性，必读经典</td>
			</tr>
			<tr>
					<td>《Effective Python》</td>
					<td>中高级</td>
					<td>90 条最佳实践</td>
			</tr>
			<tr>
					<td>《Python Cookbook》</td>
					<td>中级</td>
					<td>实用技巧与配方</td>
			</tr>
			<tr>
					<td>《深入理解 Python 特性》</td>
					<td>中级</td>
					<td>语法背后原理</td>
			</tr>
	</tbody>
</table>
<h3 id="42-专业方向">4.2 专业方向</h3>
<table>
	<thead>
			<tr>
					<th>书名</th>
					<th>方向</th>
					<th>重点</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>《Two Scoops of Django》</td>
					<td>Web</td>
					<td>Django 最佳实践</td>
			</tr>
			<tr>
					<td>《利用 Python 进行数据分析》</td>
					<td>数据</td>
					<td>Pandas 作者亲自撰写</td>
			</tr>
			<tr>
					<td>《Python 网络数据采集》</td>
					<td>爬虫</td>
					<td>爬虫系统化讲解</td>
			</tr>
			<tr>
					<td>《架构整洁之道》</td>
					<td>通用</td>
					<td>软件设计思想</td>
			</tr>
	</tbody>
</table>
<hr>
<h2 id="5-在线文档与资源">5. 在线文档与资源</h2>
<h3 id="51-官方文档">5.1 官方文档</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>Python 官方文档      https://docs.python.org/zh-cn/3/
PEP 索引            https://peps.python.org/
FastAPI 文档         https://fastapi.tiangolo.com/zh/
Django 文档          https://docs.djangoproject.com/zh-hans/
Flask 文档           https://dormousehole.readthedocs.io/
Pandas 文档          https://pandas.pydata.org/docs/</code></pre></div>
<h3 id="52-学习平台">5.2 学习平台</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>Real Python          https://realpython.com/      （高质量教程）
PyCoder&#39;s Weekly     https://pycoders.com/         （每周周刊）
Python Weekly        https://www.pythonweekly.com/ （新闻聚合）
Stack Overflow       https://stackoverflow.com/    （问答社区）</code></pre></div>
<h3 id="53-中文资源">5.3 中文资源</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>廖雪峰 Python 教程   https://liaoxuefeng.com/books/python/
菜鸟教程             https://www.runoob.com/python3/
掘金 / SegmentFault  技术社区</code></pre></div>
<hr>
<h2 id="6-优质开源项目学习">6. 优质开源项目学习</h2>
<h3 id="61-阅读源码提升">6.1 阅读源码提升</h3>
<table>
	<thead>
			<tr>
					<th>项目</th>
					<th>领域</th>
					<th>学习价值</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Flask</td>
					<td>Web 框架</td>
					<td>小而精，理解框架内核</td>
			</tr>
			<tr>
					<td>FastAPI</td>
					<td>Web 框架</td>
					<td>现代 API 设计、依赖注入</td>
			</tr>
			<tr>
					<td>Requests</td>
					<td>HTTP 库</td>
					<td>API 设计典范</td>
			</tr>
			<tr>
					<td>Click</td>
					<td>CLI 工具</td>
					<td>装饰器高级用法</td>
			</tr>
			<tr>
					<td>Rich</td>
					<td>终端美化</td>
					<td>类型提示、协议实战</td>
			</tr>
			<tr>
					<td>httpx</td>
					<td>HTTP 客户端</td>
					<td>异步架构设计</td>
			</tr>
	</tbody>
</table>
<h3 id="62-参与开源">6.2 参与开源</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 从 Good First Issue 开始</span>
</span></span><span class="line"><span class="cl"><span class="c1">#    GitHub 搜索 label:&#34;good first issue&#34; language:Python</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 阅读贡献指南（CONTRIBUTING.md）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 从文档改进、Bug 修复开始</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 逐步参与功能开发</span></span></span></code></pre></div></div>
<hr>
<h2 id="7-编码能力提升方法">7. 编码能力提升方法</h2>
<h3 id="71-刷题练习">7.1 刷题练习</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>LeetCode        https://leetcode.cn/        （算法面试）
HackerRank      https://www.hackerrank.com/  （Python 专项）
Codewars        https://www.codewars.com/    （游戏化练习）
Exercism        https://exercism.org/        （代码评审）

建议：
- 每日 1-2 题，坚持 3 个月
- 先独立思考，再看题解
- 注重时间/空间复杂度分析</code></pre></div>
<h3 id="72-项目实战">7.2 项目实战</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>进阶项目建议（由易到难）：

1. 命令行待办工具（argparse + JSON 存储）
2. 个人博客系统（FastAPI + SQLite）
3. 股票数据分析仪表盘（Pandas + Plotly）
4. 分布式爬虫系统（Scrapy + Redis）
5. 即时聊天应用（WebSocket + asyncio）
6. 微服务电商后台（FastAPI + Docker + PostgreSQL）</code></pre></div>
<h3 id="73-代码审查">7.3 代码审查</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 审查自己代码的检查清单：</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># □ 命名是否清晰（变量、函数、类）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># □ 函数是否单一职责（不超过 30 行）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># □ 是否有类型提示</span>
</span></span><span class="line"><span class="cl"><span class="c1"># □ 异常是否被正确处理</span>
</span></span><span class="line"><span class="cl"><span class="c1"># □ 是否有重复代码（DRY 原则）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># □ 是否有单元测试</span>
</span></span><span class="line"><span class="cl"><span class="c1"># □ 是否通过 ruff / mypy 检查</span>
</span></span><span class="line"><span class="cl"><span class="c1"># □ 复杂逻辑是否有注释说明</span></span></span></code></pre></div></div>
<hr>
<h2 id="8-python-版本与生态趋势">8. Python 版本与生态趋势</h2>
<h3 id="31-近年重要特性">3.1 近年重要特性</h3>
<table>
	<thead>
			<tr>
					<th>版本</th>
					<th>年份</th>
					<th>重要特性</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>3.9</td>
					<td>2020</td>
					<td>字典合并运算符 <code>|</code>、类型提示泛型</td>
			</tr>
			<tr>
					<td>3.10</td>
					<td>2021</td>
					<td>结构化模式匹配 <code>match-case</code></td>
			</tr>
			<tr>
					<td>3.11</td>
					<td>2022</td>
					<td>性能提升 10-60%、异常组 <code>ExceptionGroup</code></td>
			</tr>
			<tr>
					<td>3.12</td>
					<td>2023</td>
					<td>更好的错误信息、<code>type</code> 语句定义泛型</td>
			</tr>
			<tr>
					<td>3.13</td>
					<td>2024</td>
					<td>实验性 JIT、自由线程（无 GIL 模式）</td>
			</tr>
	</tbody>
</table>
<h3 id="32-值得关注的新工具">3.2 值得关注的新工具</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>uv        → 超快包管理（替代 pip/pip-tools）
ruff      → 超快 linter + formatter（替代 flake8/black/isort）
mypy      → 静态类型检查
pydantic  → 数据校验（v2 基于 Rust，性能大幅提升）</code></pre></div>
<hr>
<h2 id="9-持续学习建议">9. 持续学习建议</h2>
<h3 id="91-制定计划">9.1 制定计划</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>每周学习节奏建议：

周一~周五：每天 1 小时
├── 30 分钟：学习新知识 / 阅读文档
└── 30 分钟：动手编码练习

周末：2-3 小时
├── 完整项目实战
└── 总结复盘 + 写技术笔记</code></pre></div>
<h3 id="92-知识管理">9.2 知识管理</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>建立个人知识库：

1. 用 Markdown 记录学习笔记
2. GitHub 维护代码示例仓库
3. 写技术博客（输出倒逼输入）
4. 定期回顾与重构旧代码
5. 关注 PEP 提案，了解语言演进</code></pre></div>
<h3 id="93-社区参与">9.3 社区参与</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>- 加入 Python 中文社区 / 本地 PyCon
- 参与开源项目贡献
- 在 Stack Overflow 回答问题
- 技术分享（公司内部 / 线上直播）</code></pre></div>
<hr>
<h2 id="10-小结">10. 小结</h2>
<table>
	<thead>
			<tr>
					<th>维度</th>
					<th>建议</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>基础</td>
					<td>语法扎实，多写多练</td>
			</tr>
			<tr>
					<td>进阶</td>
					<td>读源码，理解原理</td>
			</tr>
			<tr>
					<td>方向</td>
					<td>选定一个方向深耕</td>
			</tr>
			<tr>
					<td>实战</td>
					<td>做完整项目，而非片段</td>
			</tr>
			<tr>
					<td>持续</td>
					<td>保持学习，跟进生态</td>
			</tr>
			<tr>
					<td>输出</td>
					<td>写博客 / 参与开源</td>
			</tr>
	</tbody>
</table>
<blockquote>
<p><strong>学习没有捷径，但方向比速度更重要。</strong> 扎实基础 → 选择方向 → 深度实战 → 持续输出，这是最可靠的成长路径。</p>]]></description>
</item>
<item>
    <title>Python 项目最佳实践</title>
    <link>https://example.com/posts/language/python-54-python%E9%A1%B9%E7%9B%AE%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/</link>
    <pubDate>Sat, 27 Dec 2025 00:00:00 &#43;0000</pubDate>
    <author>ixiaoqiang0011@gmail.com (Qzai)</author>
    <guid>https://example.com/posts/language/python-54-python%E9%A1%B9%E7%9B%AE%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/</guid>
    <description><![CDATA[<p><strong>学习目标</strong>：掌握 Python 项目的工程化最佳实践，涵盖目录结构、配置管理、依赖锁定、部署上线与 CI/CD。</p>
<hr>
<h2 id="1-项目目录结构">1. 项目目录结构</h2>
<h3 id="11-标准结构">1.1 标准结构</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>my_project/
├── pyproject.toml        # 项目元数据与依赖（现代标准）
├── requirements.txt      # 依赖锁定（兼容传统工具）
├── README.md             # 项目说明
├── .gitignore            # Git 忽略规则
├── .env.example          # 环境变量示例
├── Makefile              # 常用命令快捷方式
├── src/                  # 源码目录
│   └── my_package/
│       ├── __init__.py
│       ├── core/         # 核心逻辑
│       ├── models/       # 数据模型
│       ├── services/     # 业务服务
│       └── utils/        # 工具函数
├── tests/                # 测试目录
│   ├── conftest.py       # pytest 固件
│   ├── unit/             # 单元测试
│   └── integration/      # 集成测试
├── docs/                 # 文档
└── scripts/              # 脚本工具</code></pre></div>
<h3 id="12-使用-src-布局的好处">1.2 使用 src 布局的好处</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># src 布局强制安装后才可导入，避免测试误用本地路径</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 传统布局（不推荐）</span>
</span></span><span class="line"><span class="cl"><span class="n">my_package</span><span class="o">/</span>
</span></span><span class="line"><span class="cl">    <span class="fm">__init__</span><span class="o">.</span><span class="n">py</span>
</span></span><span class="line"><span class="cl"><span class="n">tests</span><span class="o">/</span>
</span></span><span class="line"><span class="cl">    <span class="n">test_xxx</span><span class="o">.</span><span class="n">py</span>   <span class="c1"># 可能直接 import my_package（未安装状态）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># src 布局（推荐）</span>
</span></span><span class="line"><span class="cl"><span class="n">src</span><span class="o">/</span>
</span></span><span class="line"><span class="cl">    <span class="n">my_package</span><span class="o">/</span>
</span></span><span class="line"><span class="cl">        <span class="fm">__init__</span><span class="o">.</span><span class="n">py</span>
</span></span><span class="line"><span class="cl"><span class="n">tests</span><span class="o">/</span>
</span></span><span class="line"><span class="cl">    <span class="n">test_xxx</span><span class="o">.</span><span class="n">py</span>   <span class="c1"># 必须先 pip install -e . 才能导入</span></span></span></code></pre></div></div>
<hr>
<h2 id="2-项目配置">2. 项目配置</h2>
<h3 id="21-pyprojecttoml推荐">2.1 pyproject.toml（推荐）</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-toml">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># pyproject.toml</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">build-system</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">requires</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;setuptools&gt;=68.0&#34;</span><span class="p">,</span> <span class="s2">&#34;wheel&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">build-backend</span> <span class="p">=</span> <span class="s2">&#34;setuptools.backends._legacy:_Backend&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">project</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">name</span> <span class="p">=</span> <span class="s2">&#34;my-package&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">version</span> <span class="p">=</span> <span class="s2">&#34;1.0.0&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">description</span> <span class="p">=</span> <span class="s2">&#34;我的 Python 项目&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">requires-python</span> <span class="p">=</span> <span class="s2">&#34;&gt;=3.10&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">dependencies</span> <span class="p">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;requests&gt;=2.31&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;pydantic&gt;=2.0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">project</span><span class="p">.</span><span class="nx">optional-dependencies</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">dev</span> <span class="p">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;pytest&gt;=7.0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;pytest-cov&gt;=4.0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;ruff&gt;=0.1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mypy&gt;=1.5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">project</span><span class="p">.</span><span class="nx">scripts</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">my-tool</span> <span class="p">=</span> <span class="s2">&#34;my_package.cli:main&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># ruff 配置</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">tool</span><span class="p">.</span><span class="nx">ruff</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">line-length</span> <span class="p">=</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl"><span class="nx">target-version</span> <span class="p">=</span> <span class="s2">&#34;py310&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">tool</span><span class="p">.</span><span class="nx">ruff</span><span class="p">.</span><span class="nx">lint</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">select</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;E&#34;</span><span class="p">,</span> <span class="s2">&#34;F&#34;</span><span class="p">,</span> <span class="s2">&#34;I&#34;</span><span class="p">,</span> <span class="s2">&#34;N&#34;</span><span class="p">,</span> <span class="s2">&#34;W&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># pytest 配置</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">tool</span><span class="p">.</span><span class="nx">pytest</span><span class="p">.</span><span class="nx">ini_options</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">testpaths</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;tests&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">addopts</span> <span class="p">=</span> <span class="s2">&#34;-v --cov=my_package --cov-report=term-missing&#34;</span></span></span></code></pre></div></div>
<h3 id="22-环境变量管理">2.2 环境变量管理</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># config.py</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pydantic_settings</span> <span class="kn">import</span> <span class="n">BaseSettings</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">lru_cache</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Settings</span><span class="p">(</span><span class="n">BaseSettings</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;应用配置（从环境变量读取）&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">app_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&#34;My App&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">debug</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl">    <span class="n">database_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&#34;sqlite:///./app.db&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">secret_key</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&#34;change-me&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">api_timeout</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">30</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">class</span> <span class="nc">Config</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">env_file</span> <span class="o">=</span> <span class="s2">&#34;.env&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="n">env_file_encoding</span> <span class="o">=</span> <span class="s2">&#34;utf-8&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@lru_cache</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_settings</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Settings</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;单例配置（缓存）&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">Settings</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 使用</span>
</span></span><span class="line"><span class="cl"><span class="n">settings</span> <span class="o">=</span> <span class="n">get_settings</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">database_url</span><span class="p">)</span></span></span></code></pre></div></div>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># .env</span>
</span></span><span class="line"><span class="cl"><span class="nv">DEBUG</span><span class="o">=</span><span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="nv">DATABASE_URL</span><span class="o">=</span>postgresql://user:pass@localhost:5432/mydb
</span></span><span class="line"><span class="cl"><span class="nv">SECRET_KEY</span><span class="o">=</span>your-production-secret</span></span></code></pre></div></div>
<hr>
<h2 id="3-依赖管理">3. 依赖管理</h2>
<h3 id="31-使用-pip-tools-锁定依赖">3.1 使用 pip-tools 锁定依赖</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">pip install pip-tools
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 编写 requirements.in（顶层依赖）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># requirements.in</span>
</span></span><span class="line"><span class="cl">fastapi
</span></span><span class="line"><span class="cl">uvicorn<span class="o">[</span>standard<span class="o">]</span>
</span></span><span class="line"><span class="cl">sqlalchemy
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 编译生成锁定的 requirements.txt</span>
</span></span><span class="line"><span class="cl">pip-compile requirements.in -o requirements.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 安装精确版本</span>
</span></span><span class="line"><span class="cl">pip-sync requirements.txt</span></span></code></pre></div></div>
<h3 id="32-使用-uv高性能替代">3.2 使用 uv（高性能替代）</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装 uv（Rust 编写，极快）</span>
</span></span><span class="line"><span class="cl">curl -LsSf https://astral.sh/uv/install.sh <span class="p">|</span> sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 创建项目</span>
</span></span><span class="line"><span class="cl">uv init my_project
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> my_project
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 添加依赖</span>
</span></span><span class="line"><span class="cl">uv add fastapi uvicorn sqlalchemy
</span></span><span class="line"><span class="cl">uv add --dev pytest ruff mypy
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 同步环境</span>
</span></span><span class="line"><span class="cl">uv sync
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 运行</span>
</span></span><span class="line"><span class="cl">uv run pytest</span></span></code></pre></div></div>
<hr>
<h2 id="4-日志与配置">4. 日志与配置</h2>
<h3 id="41-结构化日志">4.1 结构化日志</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># logging_config.py</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">logging</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">setup_logging</span><span class="p">(</span><span class="n">log_file</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&#34;app.log&#34;</span><span class="p">,</span> <span class="n">level</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&#34;INFO&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;配置日志&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">log_format</span> <span class="o">=</span> <span class="s2">&#34;</span><span class="si">%(asctime)s</span><span class="s2"> | </span><span class="si">%(levelname)-8s</span><span class="s2"> | </span><span class="si">%(name)s</span><span class="s2"> | </span><span class="si">%(message)s</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">date_format</span> <span class="o">=</span> <span class="s2">&#34;%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 控制台 + 文件双输出</span>
</span></span><span class="line"><span class="cl">    <span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">level</span><span class="o">=</span><span class="n">level</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nb">format</span><span class="o">=</span><span class="n">log_format</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">datefmt</span><span class="o">=</span><span class="n">date_format</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">handlers</span><span class="o">=</span><span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="n">logging</span><span class="o">.</span><span class="n">FileHandler</span><span class="p">(</span><span class="n">log_file</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 降低第三方库日志级别</span>
</span></span><span class="line"><span class="cl">    <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s2">&#34;urllib3&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">WARNING</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 使用</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">setup_logging</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&#34;服务启动&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&#34;数据库连接失败&#34;</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></span></span></code></pre></div></div>
<h3 id="42-使用-loguru更简洁">4.2 使用 loguru（更简洁）</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">loguru</span> <span class="kn">import</span> <span class="n">logger</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 自动带颜色、时间、文件位置</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&#34;用户登录: user_id=</span><span class="si">{}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="mi">123</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 输出到文件并自动轮转</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&#34;app.log&#34;</span><span class="p">,</span> <span class="n">rotation</span><span class="o">=</span><span class="s2">&#34;10 MB&#34;</span><span class="p">,</span> <span class="n">retention</span><span class="o">=</span><span class="s2">&#34;7 days&#34;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&#34;utf-8&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># JSON 格式（便于日志收集）</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&#34;app.json&#34;</span><span class="p">,</span> <span class="n">serialize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="mi">1</span> <span class="o">/</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s2">&#34;计算失败&#34;</span><span class="p">)</span></span></span></code></pre></div></div>
<hr>
<h2 id="5-错误处理架构">5. 错误处理架构</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># errors.py</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Enum</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">ErrorCode</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">SUCCESS</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="n">PARAM_ERROR</span> <span class="o">=</span> <span class="mi">1001</span>
</span></span><span class="line"><span class="cl">    <span class="n">NOT_FOUND</span> <span class="o">=</span> <span class="mi">1002</span>
</span></span><span class="line"><span class="cl">    <span class="n">UNAUTHORIZED</span> <span class="o">=</span> <span class="mi">1003</span>
</span></span><span class="line"><span class="cl">    <span class="n">SERVER_ERROR</span> <span class="o">=</span> <span class="mi">5000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@dataclass</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">AppError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;应用统一异常&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">code</span><span class="p">:</span> <span class="n">ErrorCode</span>
</span></span><span class="line"><span class="cl">    <span class="n">message</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">__post_init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 业务中使用</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_user</span><span class="p">(</span><span class="n">user_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">user</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">User</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">user_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">user</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">raise</span> <span class="n">AppError</span><span class="p">(</span><span class="n">ErrorCode</span><span class="o">.</span><span class="n">NOT_FOUND</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&#34;用户 </span><span class="si">{</span><span class="n">user_id</span><span class="si">}</span><span class="s2"> 不存在&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">user</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 统一捕获</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">handle_errors</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;错误处理装饰器&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">wraps</span>
</span></span><span class="line"><span class="cl">    <span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">{</span><span class="s2">&#34;code&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">&#34;message&#34;</span><span class="p">:</span> <span class="s2">&#34;success&#34;</span><span class="p">,</span> <span class="s2">&#34;data&#34;</span><span class="p">:</span> <span class="n">result</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">except</span> <span class="n">AppError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">{</span><span class="s2">&#34;code&#34;</span><span class="p">:</span> <span class="n">e</span><span class="o">.</span><span class="n">code</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="s2">&#34;message&#34;</span><span class="p">:</span> <span class="n">e</span><span class="o">.</span><span class="n">message</span><span class="p">,</span> <span class="s2">&#34;data&#34;</span><span class="p">:</span> <span class="kc">None</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s2">&#34;未预期错误&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">{</span><span class="s2">&#34;code&#34;</span><span class="p">:</span> <span class="mi">5000</span><span class="p">,</span> <span class="s2">&#34;message&#34;</span><span class="p">:</span> <span class="s2">&#34;服务器错误&#34;</span><span class="p">,</span> <span class="s2">&#34;data&#34;</span><span class="p">:</span> <span class="kc">None</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">wrapper</span></span></span></code></pre></div></div>
<hr>
<h2 id="6-部署上线">6. 部署上线</h2>
<h3 id="61-docker-容器化">6.1 Docker 容器化</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-dockerfile">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dockerfile" data-lang="dockerfile"><span class="line"><span class="cl"><span class="c"># Dockerfile</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="s">python:3.12-slim</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">WORKDIR</span><span class="w"> </span><span class="s">/app</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="c"># 安装依赖（利用缓存层）</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">COPY</span> requirements.txt .<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">RUN</span> pip install --no-cache-dir -r requirements.txt<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="c"># 拷贝源码</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">COPY</span> src/ ./src/<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">COPY</span> pyproject.toml .<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="c"># 安装项目</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">RUN</span> pip install -e .<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">EXPOSE</span><span class="w"> </span><span class="s">8000</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">CMD</span> <span class="p">[</span><span class="s2">&#34;uvicorn&#34;</span><span class="p">,</span> <span class="s2">&#34;my_package.main:app&#34;</span><span class="p">,</span> <span class="s2">&#34;--host&#34;</span><span class="p">,</span> <span class="s2">&#34;0.0.0.0&#34;</span><span class="p">,</span> <span class="s2">&#34;--port&#34;</span><span class="p">,</span> <span class="s2">&#34;8000&#34;</span><span class="p">]</span></span></span></code></pre></div></div>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-yaml">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># docker-compose.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3.8&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">api</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">build</span><span class="p">:</span><span class="w"> </span><span class="l">.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8000:8000&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">DATABASE_URL=postgresql://user:pass@db:5432/mydb</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">depends_on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">db</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">db</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">postgres:16</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">POSTGRES_USER</span><span class="p">:</span><span class="w"> </span><span class="l">user</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">POSTGRES_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l">pass</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">POSTGRES_DB</span><span class="p">:</span><span class="w"> </span><span class="l">mydb</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">pgdata:/var/lib/postgresql/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">redis</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">redis:7-alpine</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="l">pgdata:</span></span></span></code></pre></div></div>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 构建并启动</span>
</span></span><span class="line"><span class="cl">docker-compose up -d --build</span></span></code></pre></div></div>
<h3 id="62-gunicorn--uvicorn-生产部署">6.2 Gunicorn + Uvicorn 生产部署</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">pip install gunicorn uvicorn<span class="o">[</span>standard<span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 多 worker 部署</span>
</span></span><span class="line"><span class="cl">gunicorn my_package.main:app <span class="se">\
</span></span></span><span class="line"><span class="cl">    -w <span class="m">4</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">    -k uvicorn.workers.UvicornWorker <span class="se">\
</span></span></span><span class="line"><span class="cl">    --bind 0.0.0.0:8000 <span class="se">\
</span></span></span><span class="line"><span class="cl">    --timeout <span class="m">120</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">    --access-logfile - <span class="se">\
</span></span></span><span class="line"><span class="cl">    --error-logfile -</span></span></code></pre></div></div>
<hr>
<h2 id="7-cicd-自动化">7. CI/CD 自动化</h2>
<h3 id="71-github-actions">7.1 GitHub Actions</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-yaml">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># .github/workflows/ci.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">CI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">push</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">branches</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">main, develop]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pull_request</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">branches</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">main]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">jobs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">test</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l">ubuntu-latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">matrix</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">python-version</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;3.10&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;3.11&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;3.12&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/checkout@v4</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">安装 Python</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/setup-python@v5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">python-version</span><span class="p">:</span><span class="w"> </span><span class="l">${{ matrix.python-version }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">安装依赖</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">          pip install -e &#34;.[dev]&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">代码检查</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">          ruff check src/ tests/
</span></span></span><span class="line"><span class="cl"><span class="sd">          mypy src/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">运行测试</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">pytest --cov</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">上传覆盖率</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">codecov/codecov-action@v4</span></span></span></code></pre></div></div>
<h3 id="72-makefile-快捷命令">7.2 Makefile 快捷命令</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-makefile">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-makefile" data-lang="makefile"><span class="line"><span class="cl"><span class="c"># Makefile
</span></span></span><span class="line"><span class="cl"><span class="nf">.PHONY</span><span class="o">:</span> <span class="n">install</span> <span class="n">test</span> <span class="n">lint</span> <span class="n">format</span> <span class="n">type</span>-<span class="n">check</span> <span class="n">clean</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">install</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">	pip install -e <span class="s2">&#34;.[dev]&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">test</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">	pytest -v --cov
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">lint</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">	ruff check src/ tests/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">format</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">	ruff format src/ tests/
</span></span><span class="line"><span class="cl">	ruff check --fix src/ tests/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">type-check</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">	mypy src/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">clean</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">	find . -type d -name __pycache__ -exec rm -rf <span class="o">{}</span> +
</span></span><span class="line"><span class="cl">	find . -type d -name .pytest_cache -exec rm -rf <span class="o">{}</span> +
</span></span><span class="line"><span class="cl">	rm -rf .coverage htmlcov dist build *.egg-info
</span></span></code></pre></div></div>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make install   <span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">make <span class="nb">test</span>      <span class="c1"># 测试</span>
</span></span><span class="line"><span class="cl">make lint      <span class="c1"># 检查</span>
</span></span><span class="line"><span class="cl">make format    <span class="c1"># 格式化</span></span></span></code></pre></div></div>
<hr>
<h2 id="8-性能优化要点">8. 性能优化要点</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 1. 使用 __slots__ 减少内存</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Point</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="s1">&#39;y&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">x</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">y</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 使用生成器处理大数据</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">read_large_file</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">yield</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 字符串拼接用 join</span>
</span></span><span class="line"><span class="cl"><span class="n">parts</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">,</span> <span class="s1">&#39;c&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span>  <span class="c1"># 比 += 快</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 使用局部变量加速循环</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">append</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">append</span>  <span class="c1"># 局部引用</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">append</span><span class="p">(</span><span class="n">item</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 缓存计算结果</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">lru_cache</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">128</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">n</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span></span></span></code></pre></div></div>
<hr>
<h2 id="9-小结">9. 小结</h2>
<table>
	<thead>
			<tr>
					<th>维度</th>
					<th>推荐方案</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>项目结构</td>
					<td>src 布局 + pyproject.toml</td>
			</tr>
			<tr>
					<td>依赖管理</td>
					<td>uv / pip-tools 锁定版本</td>
			</tr>
			<tr>
					<td>配置管理</td>
					<td>pydantic-settings + .env</td>
			</tr>
			<tr>
					<td>日志</td>
					<td>loguru 或标准 logging</td>
			</tr>
			<tr>
					<td>代码质量</td>
					<td>ruff + mypy + pytest</td>
			</tr>
			<tr>
					<td>容器化</td>
					<td>Docker + docker-compose</td>
			</tr>
			<tr>
					<td>生产部署</td>
					<td>Gunicorn + Uvicorn</td>
			</tr>
			<tr>
					<td>CI/CD</td>
					<td>GitHub Actions</td>
			</tr>
	</tbody>
</table>
<hr>
<h2 id="10-练习题">10. 练习题</h2>
<ol>
<li>将之前的 API 项目改造为 src 布局，使用 pyproject.toml 管理依赖。</li>
<li>为项目编写 Dockerfile 和 docker-compose.yml，实现一键部署。</li>
<li>配置 GitHub Actions，实现推送代码自动运行 lint 和测试。</li>
<li>使用 Makefile 整合 install、test、lint、format 命令。</li>
</ol>
<hr>
<blockquote>
<p><strong>下节预告</strong>：我们将梳理 Python 学习路线与推荐资源，为持续进阶指明方向。</p>]]></description>
</item>
</channel>
</rss>
