《Python高级编程》1.1 一切皆对象:类型、标识与引用
本节从 CPython 实现层拆开「一切皆对象」:用 id/type/sys.getsizeof 实测 PyObject 的引用计数与类型指针,用 sys.getrefcount 观察 3.12+ 的不朽对象(PEP 683),用 dis 反汇编说清名字绑定只是字典指向对象,并给出小整数缓存与字符串驻留的真实边界。
tag
本节从 CPython 实现层拆开「一切皆对象」:用 id/type/sys.getsizeof 实测 PyObject 的引用计数与类型指针,用 sys.getrefcount 观察 3.12+ 的不朽对象(PEP 683),用 dis 反汇编说清名字绑定只是字典指向对象,并给出小整数缓存与字符串驻留的真实边界。
回到最前线的防御:用 Pydantic 与 pathlib 把不可信输入挡在门外并真跑路径遍历拦截,讲透密码哈希、危险函数禁用、依赖供应链的威胁模型、锁文件加 hash 校验、pip-audit 扫描与 SBOM 思路,最后落到最小权限加固清单。
认证之后是授权:本节对比 ACL/RBAC/ABAC 三种模型,用角色到权限集合实现 RBAC 并接进 FastAPI 依赖,再讲透多租户的独立库、独立 schema 与行级 tenant_id 三种隔离方案,并写出能真跑的越权测试用例验证边界。
认证回答「你是谁」:本节用标准库 hmac/hashlib 手写 HS256 的 JWT 签发与校验并真跑,讲透算法混淆、过期与时钟偏移三类坑,再把 Bearer 依赖接进 FastAPI,最后梳理 OAuth2 授权码流程与 PKCE 的工程要点。
手把手搭建机器学习开发环境:Python 虚拟环境、Jupyter 生态、NumPy 数组计算、pandas 数据处理、Matplotlib 可视化与 Scikit-learn 安装,并给出常用命令速查与常见环境坑的解决方案,是零基础开始机器学习的第零课。
本节讲定时任务的三种形态与延时队列的 ZSET 调度,重点落在幂等键的设计:用 SET NX 抢占、状态机去重与结果缓存保证重复投递只执行一次,并区分「至少一次」投递语义下如何做到业务幂等;最后给出死信队列的人工重放流程与告警口径,全部用 fakeredis 2.39.0 实测。
本节先对比 Celery 与 arq 的模型差异,讲清 broker、worker、结果后端与可见性超时的机制;再用 tenacity 9.2.1 实测指数退避重试,并用纯 asyncio 加 fakeredis 2.39.0 手写一个最小可靠队列,演示 RPOPLPUSH 取任务、失败重试与死信投递的完整链路。
本节把缓存拆成三个可决策的问题:本地缓存与分布式缓存怎么分工,Cache-Aside 与 Write-Through 各自适合什么写场景,以及键命名、TTL 与淘汰策略如何一起设计。再用 fakeredis 2.39.0 实测穿透、击穿、雪崩三类故障的工程对策,并给出基于 SET NX EX 与 WATCH 的分布式锁实现。
接口一旦发布就是契约,改它要付代价。本节讲清哪些字段变更是破坏性的、哪些是安全的,用 deprecated 与 Sunset 头做渐进弃用,给出 URL/Header 两种版本化策略,并写一个能自动检测破坏性变更的 OpenAPI 契约 diff 脚本。
上一节设计好的 Pydantic 模型,本身就是一份机器可读的契约。本节让 FastAPI 导出真实的 /openapi.json,逐段解读 schema 里字段约束如何映射,再讲客户端代码生成的三条工具路径与命令,并手写一个基于 httpx + ASGITransport 的最小客户端跑通端到端调用,最后把 schema 断言写进 CI。
上一章我们用 SQLAlchemy 打通了数据库,这一节回到 HTTP 边界:用 Pydantic V2(2.13.5)设计请求/响应模型。覆盖 Field 约束与 Annotated 复用、field_validator 与 model_validator、ConfigDict 关键开关、别名、computed_field,以及 model_dump 的取舍与 from_attributes。
反序列化漏洞被称为"最被低估的高危漏洞"——它能直接导致远程代码执行(RCE),影响从 Java(Fastjson/Jackson)、Python(pickle)、PHP(unserialize)到 Ruby、Go 的几乎所有主流语言。其核心机理是:当不可信数据被反序列化时,恶意 …
Alembic 1.20.0 实战:从 init 到 env.py 配置、autogenerate 生成迁移、upgrade/downgrade/history/current 全套命令,讲清加列、数据回填与不可逆操作等演进策略,代码在 SQLite 上真跑过。
从 session 生命周期讲起,用实测数据讲清事务边界、连接池参数(pool_size/max_overflow/pool_pre_ping)与 N+1 识别治理;用事件钩子统计 SQL 条数,对比惰性、selectinload、joinedload 的真实数字。
SQLAlchemy 2.1.4 实战:用 DeclarativeBase 与 Mapped[] 定义类型化 ORM 模型,改用 select() 2.x 风格查询,讲清关系映射、加载策略与 ORM/Pydantic 模型分层的工程取舍,代码在 SQLite 上真跑过。
用 lifespan 管理应用级资源(连接池、后台任务),在 SIGTERM 下实现优雅关闭让在途请求跑完,并按 Kubernetes 语义设计 liveness 与 readiness 两类健康探针;全部用 uvicorn 0.54.0 真实进程实测。
用中间件把日志、请求 ID、耗时统计等横切关注点从业务里抽出来:对比 BaseHTTPMiddleware 与纯 ASGI 两种写法,用 request.state 与 contextvars 传递请求上下文,并实测中间件的洋葱顺序与并发下的上下文隔离。
用 FastAPI 0.143.0 搭一个分层后端:把 api / service / repository / schema 四层拆开,用 APIRouter 分文件装配,用 Depends 区分请求级与进程级依赖,用 lru_cache 做单例,并用 dependency_overrides 做测试隔离;每一步都给出真实运行结果。
给测试体系补上三块短板:用 hypothesis 的性质测试突破手写用例的输入盲区并靠反例缩小定位真实缺陷,用 pytest-benchmark 把性能退化成一道可对比的门禁,用 pytest-cov 的覆盖率与 --cov-fail-under 卡住底线。
单元测试之外的第二层防线:先划清单元与集成的边界,再用 SQLite + fixture 在本机搭出可跑的等价数据层,讲透外层事务加 SAVEPOINT 的用例隔离,最后给出 testcontainers 真实容器环境的配置并明确标注未实测。