KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

Python 拔高:生产代码里的高级写法与抽象 — keel 龙骨

不讲教科书设计模式,只讲生产级 Python 项目里真实出现、值得展开的七个写法:ContextVar 上下文隔离、线程安全单例与 frozen dataclass、模板方法与 ABC、闭包与延迟导入、声明式鉴权与中间件管道、Pydantic v2/StrEnum/注册表工厂、动态分发与反射。

不讲教科书设计模式,只讲生产级 Python 项目里真实出现、值得展开的七个写法:ContextVar 上下文隔离、线程安全单例与 frozen dataclass、模板方法与 ABC、闭包与延迟导入、声明式鉴权与中间件管道、Pydantic v2/StrEnum/注册表工厂、动态分发与反射。

章节目录

  1. 00 · ContextVar:async 时代的「请求级全局变量」 — 问题:一个 Web 请求进来,后面几十层函数都要用 user_id(写日志、打审计、查库)。一层层传参太啰嗦;用全局变量又会在并发下把 A 用户的数据串到 B 用户头上。ContextVar 是标准答案——它像全局变量一样随处可取,却每个请求/任务各持一份,互不干扰。
  2. 01 · 线程安全单例与 frozen dataclass — 问题:一个服务里管理数据库连接池的组件,全进程必须只有一个——谁来保证?连接规格(host、端口、库名)创建后绝不允许被改——谁来强制?生产代码用两个语言特性回答:带锁的 new 单例、frozen dataclass。
  3. 02 · 模板方法与抽象基类:把「不变的流程」锁死在基类 — 问题:CSV 导出和 JSON 导出是两种任务,但它们的「生命周期」一模一样——开文件、循环读记录、写每一行、统计、异常处理、收尾。把这套流程写两遍,将来改异常逻辑就得记得改两处。生产代码的解法是模板方法模式:骨架在基类,变化点留给子类。
  4. 03 · 闭包与延迟导入:两个「藏在函数里」的写法 — 两个不起眼但频繁出现的写法:函数体里再定义函数(闭包)、函数体里再 import(延迟导入)。真实代码都用在刀刃上——闭包做「本次调用内」的去重状态,延迟导入防重资源提前初始化、破循环依赖。
  5. 04 · 声明式鉴权与中间件管道:把「横切关注点」从业务里抽出去 — 问题一:每个接口都要鉴权,但鉴权逻辑写在函数体里,一千个接口就有一千种漏写的可能。问题二:中间件的执行顺序反直觉,注册顺序和执行顺序是反的,谁来管?生产代码的答案:声明(装饰器/checkers)+ 一层把「反直觉」消化掉的管道装配函数。
  6. 05 · Pydantic v2、StrEnum 与注册表工厂 — 三个「让数据自己管好自己」的写法:Pydantic v2 的类型化边界(验证+序列化)、StrEnum 让枚举值直接可比可序列化、注册表字典把「新增一种类型」变成「加一行」。
  7. 06 · 动态分发与反射:把方法存成字符串,运行时再映射回真实 callable — 问题:配置或消息队列里往往只有任务名的字符串(如 "export")。运行时怎么安全、可扩展地把它对应到真正的函数?为什么 if name == "export": ... 越写越烂?这一章讲 Python 怎么把函数当数据、按名字在运行时找回并调用——注册表、getattr、self.class、importlib、inspect——也就是你说的「方法存成字符串、启用时再对应回真方法」。

进入 keel 阅读