知其然,知其所以然
Python 2026-09-29

mypy 接入旧项目:渐进式类型化方案

本机 mypy 2.3.1 在一个旧项目上真实逐档收紧:默认配置 0 个错误、--check-untyped-defs 2 个(暴露 int + str 的真实 bug)、--disallow-untyped-defs 10 个、--strict 14 个;无注解函数返回 Any 让新代码的错误被放过;按模块设置「legacy 忽略、newcode strict」得到 3 个错误;增量缓存下重跑 0.10 s。

Python 类型检查 mypy 工程化 真实验证 动画演示
Python 2026-09-29

变异测试:测试用例真的能发现错误吗

本机 mutmut 3.8.0 真实对一个 13 行、覆盖率 100% 的小模块做变异测试:11 个变异体里 5 个被杀死、6 个存活(clamp 无断言、is_adult 只测 30、total 只测 tax=0);补上边界断言后 9 个杀死、2 个存活,那 2 个是无法被杀死的等价变异体(x <= lo 与 x < lo 在 x==lo 时返回值相同)。

Python 测试 变异测试 mutmut 真实验证 动画演示
Python 2026-09-29

测试中的时间、随机数和网络隔离

本机真实验证:依赖真实时钟的测试在一天 24 个整点里只有 8 个通过;patch("time.time") 对 from time import time 拿走的引用无效、patch 内置类型 datetime.now 报 TypeError;把时钟当参数传入可免于 patch;共享全局 random 状态会造成 a→b 通过而 b→a 失败;禁外网 fixture 让不可达地址的连接由 0.60 s 超时变成 0.0003 s 立刻报错;patch 掉 sleep 让重试测试从 1.12 s 降到 0.07 s。

Python 测试 pytest mock 真实验证 动画演示
Python 2026-09-29

并发代码如何稳定测试而不是靠运气

本机真实验证并发测试的稳定性:一段「先读后写」的存款代码自然运行 10 次全部正确(800),加一个线程让出点后 10 次全部错误(200 多);用两个 Event 排演「A 读→B 读→B 写→A 写」每次都稳定复现丢失更新(余额 1,期望 2),加锁后得 2;并用 join(timeout) 和 subprocess 超时避免卡死、用轮询代替固定 sleep(任务 20 ms 时 21 ms 通过)。

Python 测试 并发 线程 真实验证 动画演示
Python 2026-09-29

重试机制:固定间隔、指数退避和抖动

本机用 100 个真实线程冲击一个先宕机 300 ms、之后每 20 ms 只能处理 15 个请求的服务:固定 50 ms 间隔产生每格整整 100 个请求的「请求墙」(133 次限流拒绝、579 ms 完成);指数退避无抖动仍然齐发(174 次拒绝、1636 ms,最慢);加全抖动后 0 次限流拒绝、606 ms 完成。并验证只应对暂时性错误重试。

Python 可靠性 重试 并发 真实验证 动画演示
Python 2026-09-29

熔断器:Python 服务如何避免级联故障

本机自己实现熔断器并对一个 0.5–1.5 s 故障的下游做对照(8 个工作线程):50 请求/秒时熔断器把打到下游的调用从 150 次降到 86 次、故障期失败延迟从约 155 ms 降到 0.1 ms,但下游 1.5 s 就恢复而熔断器到 2.04 s 才恢复放行;100 请求/秒(超过线程池能力)时无熔断器的请求排队,故障期延迟中位 373 ms、最大 601 ms,有熔断器中位 0.1 ms。

Python 可靠性 熔断器 并发 真实验证 动画演示
Python 2026-09-29

限流器:令牌桶和漏桶怎么实现

本机用可注入的时钟实现固定窗口、滑动窗口日志、令牌桶、漏桶四种限流器并对比:跨窗口边界的突发下固定窗口放行 20/20(限制 10/s 的两倍)而滑动窗口 10、令牌桶 6;t=0 涌来 50 个请求时令牌桶只放行容量 5 个;持续高压下令牌桶任意 0.1 s 最多 5 个而固定窗口 10 个;8 个线程下加锁放行 419、不加锁 976(理论上限约 420)。

Python 可靠性 限流 算法 真实验证 动画演示
Python 2026-09-29

优雅关闭:服务收到 SIGTERM 后如何完成收尾

本机真实用 6 种方式处理正在执行第 3 个任务时收到的 SIGTERM:默认处置立刻被杀(丢失任务、cleanup 不执行);只设停止标志在 0.18 s 内做完手头任务并干净退出(退出码 0);处理函数里 sys.exit(0) 遇到普通工作线程根本退不出去(父进程等了 3 s 只能 SIGKILL),遇到守护线程则秒退但丢弃在途任务;任务卡死时只设标志会永远等下去,加 1 秒看门狗则 1.06 s 强退。

Python 可靠性 信号 进程 真实验证 动画演示
Python 2026-09-26

dataclass:类装饰器如何自动生成构造函数和比较方法

本机真实验证@dataclass自动生成的__init__/__repr__/__eq__,两个字段相同的不同实例真实判定相等;再真实验证dataclass对可变默认值直接报ValueError拒绝。

Python 真实验证 动画演示
Python 2026-09-26

Python 字节码:dis 看到的指令是怎么执行的

本机真实用dis.dis反编译一个只有一行return x+1的函数,真实看到CPython 3.14的解释器用LOAD_FAST_BORROW+LOAD_SMALL_INT+BINARY_OP三条指令完成这次加法,连字面量1都真实走了专门的LOAD_SMALL_INT指令而不是普通常量表查找。

Python 真实验证 动画演示
Python 2026-09-26

Python 函数调用:参数绑定、局部变量和栈帧

本机真实用sys._getframe()掏出一次函数调用真实的栈帧,验证*args/**kwargs真实被打包进f_locals的两个元素,以及frame.f_back真实怎么串起调用链。

Python 真实验证 动画演示
Python 2026-09-26

sys.settrace 与调试器:Python 如何逐行跟踪代码

本机真实给一个跑3次循环的函数装上sys.settrace跟踪器,真实拿到11个事件,理解pdb单步调试真实的底层机制。

Python 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号