<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>语义化版本 on PlumePHP</title><link>https://plumephp.com/tags/%E8%AF%AD%E4%B9%89%E5%8C%96%E7%89%88%E6%9C%AC/</link><description>Recent content in 语义化版本 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 28 Sep 2026 13:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E8%AF%AD%E4%B9%89%E5%8C%96%E7%89%88%E6%9C%AC/index.xml" rel="self" type="application/rss+xml"/><item><title>Python 库与 API 设计：从包结构到向后兼容</title><link>https://plumephp.com/python-api-library-design/</link><pubDate>Mon, 28 Sep 2026 13:00:00 +0800</pubDate><guid>https://plumephp.com/python-api-library-design/</guid><description>&lt;blockquote&gt;
&lt;p&gt;写一个「能跑」的脚本容易，写一个「好用」的库难。本文从 Python 库作者视角，拆解公开 API 面设计、兼容性保障与文档工程的完整方法论。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="目录"&gt;目录&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#1-%E5%BA%93-vs-%E5%BA%94%E7%94%A8%E8%AE%BE%E8%AE%A1%E7%9B%AE%E6%A0%87%E5%B7%AE%E5%BC%82"&gt;库 vs 应用：设计目标差异&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E5%8C%85%E7%BB%93%E6%9E%84%E4%B8%8E%E6%A8%A1%E5%9D%97%E5%88%92%E5%88%86"&gt;包结构与模块划分&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E5%85%AC%E5%BC%80-api-%E9%9D%A2%E8%AE%BE%E8%AE%A1"&gt;公开 API 面设计&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E7%B1%BB%E5%9E%8B%E6%A0%87%E6%B3%A8%E4%B8%8E-protocol"&gt;类型标注与 Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E8%AF%AD%E4%B9%89%E5%8C%96%E7%89%88%E6%9C%AC%E4%B8%8E%E5%85%BC%E5%AE%B9%E6%80%A7"&gt;语义化版本与兼容性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-%E5%90%91%E5%90%8E%E5%85%BC%E5%AE%B9%E7%AD%96%E7%95%A5"&gt;向后兼容策略&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#7-%E6%96%87%E6%A1%A3%E5%B7%A5%E7%A8%8B"&gt;文档工程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#8-%E9%94%99%E8%AF%AF%E8%AE%BE%E8%AE%A1"&gt;错误设计&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#9-%E5%8F%91%E5%B8%83%E4%B8%8E%E7%A4%BE%E5%8C%BA%E6%B2%BB%E7%90%86"&gt;发布与社区治理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#10-%E6%A1%88%E4%BE%8B%E6%8B%86%E8%A7%A3%E4%B8%8E%E9%80%9F%E6%9F%A5%E8%A1%A8"&gt;案例拆解与速查表&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="1-库-vs-应用设计目标差异"&gt;1. 库 vs 应用：设计目标差异&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;应用&lt;/th&gt;
					&lt;th&gt;库&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;使用者&lt;/td&gt;
					&lt;td&gt;你（可控）&lt;/td&gt;
					&lt;td&gt;陌生用户（不可控）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;变更&lt;/td&gt;
					&lt;td&gt;随意改&lt;/td&gt;
					&lt;td&gt;必须兼容&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;日志&lt;/td&gt;
					&lt;td&gt;随便打&lt;/td&gt;
					&lt;td&gt;用 &lt;code&gt;logger = logging.getLogger(__name__)&lt;/code&gt; 但要克制&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;依赖&lt;/td&gt;
					&lt;td&gt;随意&lt;/td&gt;
					&lt;td&gt;尽量少，避免依赖地狱&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;错误&lt;/td&gt;
					&lt;td&gt;可崩溃&lt;/td&gt;
					&lt;td&gt;抛明确异常&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;接口&lt;/td&gt;
					&lt;td&gt;内部实现&lt;/td&gt;
					&lt;td&gt;长期契约&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;第一原则&lt;/strong&gt;：库作者要「克制」。每个新增功能都是未来要维护的契约。&lt;/p&gt;</description></item></channel></rss>