<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Python on Jeanphilo Blog</title><link>https://jeanphilogong.github.io/jeanblog/zh/tags/python/</link><description>Recent content in Python on Jeanphilo Blog</description><generator>Hugo -- 0.168.0</generator><language>zh-cn</language><lastBuildDate>Sun, 25 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jeanphilogong.github.io/jeanblog/zh/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>分层之后，为什么每一层还在重复校验？</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/architecture/validation-at-boundaries/</link><pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/architecture/validation-at-boundaries/</guid><description>用一个修改商品价格的例子，区分入口类型检查、领域业务约束与存储转换，减少分层系统中的重复校验和无目的抽象。</description></item><item><title>让 Agent 少写防御性代码：每条校验都要有理由</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/architecture/validation-needs-a-reason/</link><pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/architecture/validation-needs-a-reason/</guid><description>从策略工具的数组转换、反馈读取和查询筛选三个例子出发，判断哪些校验有实际用途，哪些只是重复工作，并给出约束 Agent 的编码规则。</description></item><item><title>Pydantic 的 field_validator：字段什么时候校验，返回值去了哪里？</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/pydantic-field-validator/</link><pubDate>Thu, 22 Oct 2026 17:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/pydantic-field-validator/</guid><description>用考试成绩校验理解 Pydantic v2 的 field_validator：自动调用、返回值、ValueError 和校验顺序。</description></item><item><title>如何实现一次 Agent 工具调用</title><link>https://jeanphilogong.github.io/jeanblog/zh/thoughts/thoughts/agent-tool-calling-with-responses-api/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/thoughts/thoughts/agent-tool-calling-with-responses-api/</guid><description>这篇文章只记录 Agent 工具调用的最小闭环：声明工具 schema、接收 function_call、执行本地函数，并通过 function_call_output 继续下一次模型决策。</description></item><item><title>Python range() 的边界：为什么循环有时一次也不执行？</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-range-empty-range/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-range-empty-range/</guid><description>从 range(10, 7) 出发，解释 Python range() 的起点、终点和步长，理解空范围为什么不会报错，以及它如何自动跳过不需要处理的循环。</description></item><item><title>Redis 任务队列系列（1）：用 Python 和 List 实现最小生产消费模型</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/distributed/redis-task-queue-python-list/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/distributed/redis-task-queue-python-list/</guid><description>使用 redis-py 和 Redis List 写出一个可以运行的最小任务队列，理解 LPUSH、BRPOP、阻塞消费、FIFO 与任务丢失边界。</description></item><item><title>后台异步任务什么时候算队列：从生产者与消费者理解 Celery、Redis</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/distributed/background-tasks-and-task-queues/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/distributed/background-tasks-and-task-queues/</guid><description>从用户提交五个计算任务出发，解释后台异步执行、前端查询状态与任务队列的区别，用 Python 示例说明生产消费解耦，并讲清 Celery、Redis 和数据库队列的关系。</description></item><item><title>Python 中 @staticmethod 和 @abstractmethod 的区别</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/staticmethod-vs-abstractmethod/</link><pubDate>Wed, 09 Sep 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/staticmethod-vs-abstractmethod/</guid><description>理解 @staticmethod 与 @abstractmethod 解决的问题，掌握实例方法、静态方法、类方法和抽象方法的选择方式。</description></item><item><title>JSON 不只是键值对：Python 列表如何映射到 SQLAlchemy JSON 列</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/json-not-key-value-sqlalchemy-json-column/</link><pubDate>Tue, 08 Sep 2026 10:30:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/json-not-key-value-sqlalchemy-json-column/</guid><description>从一个关键词订阅的 Repository 示例出发，解释 JSON 对象与数组、Python list 与 tuple 的转换边界，以及 SQLAlchemy JSON 列的持久化和原地修改注意事项。</description></item><item><title>Python 类型标注中的 tuple[T, ...]：任意长度和固定长度</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-tuple-ellipsis-type-annotation/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-tuple-ellipsis-type-annotation/</guid><description>通过 ParsedDocument 的 blocks 字段，解释 Python 中 tuple[T, ...]、tuple[T] 和 tuple[T1, T2] 的区别，以及什么时候应该使用 tuple 或 list。</description></item><item><title>Python 中 if not value 与 is None 的区别</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-if-not-vs-is-none/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-if-not-vs-is-none/</guid><description>从逐行解析文档的空行过滤代码出发，解释 Python 中 if not value 与 value is None 的语义差异、适用边界和常见误区。</description></item><item><title>Python 字符串为什么不可变：从 replace 到变量重绑定</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-string-immutability/</link><pubDate>Fri, 28 Aug 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-string-immutability/</guid><description>用可运行示例解释 Python str 的不可变性，区分字符串对象不变与变量重新赋值，并说明 replace、切片、+= 和循环拼接的真实行为。</description></item><item><title>函数命名不是取名字：它是在描述系统边界</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/function-naming-design-intent/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/function-naming-design-intent/</guid><description>用一个小型 graph pipeline runner 解释 get、resolve、validate、ready、skip 等函数命名如何表达行为、失败语义和副作用。</description></item><item><title>从顺序 Pipeline Runner 演进到 Graph Runner</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/engineering/minimal-pipeline-runner-v1/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/engineering/minimal-pipeline-runner-v1/</guid><description>在最小顺序 Pipeline Runner 的基础上，继续推导 graph pipeline runner：为什么 workflow list 不够用，为什么要用 dependency map、ready wave、GraphNodeRecord 和失败分支跳过。</description></item><item><title>从普通函数调用推导一个最小 Pipeline Runner</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/engineering/minimal-pipeline-runner-v0/</link><pubDate>Fri, 29 May 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/engineering/minimal-pipeline-runner-v0/</guid><description>从普通函数调用开始，逐步推导一个最小顺序 Pipeline Runner：工程接入场景、run/step observation、共享 context、mode 解析、handler 表和 PipelineRunner.trigger。</description></item><item><title>请求日志一定要带 RequestId 吗？Python 成熟实践与落地指南</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/request-id-logging-best-practices/</link><pubDate>Thu, 29 Jan 2026 15:16:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/request-id-logging-best-practices/</guid><description>系统回答“日志是否需要 requestId”，并给出 Python 工业级自动注入方案、工程场景与排查流程。</description></item><item><title>我最喜欢的语言的三个缺陷：以 Python 为例</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/language/three-worst-flaws-python/</link><pubDate>Sat, 24 Jan 2026 15:29:20 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/language/three-worst-flaws-python/</guid><description>从工程角度分析 Python 的三大缺陷及其应对策略。</description></item><item><title>Python 抽象基类 ABC vs ABCMeta：什么时候用哪个？</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/abc-vs-abcmeta-hugo/</link><pubDate>Fri, 12 Dec 2025 23:52:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/abc-vs-abcmeta-hugo/</guid><description>用可运行示例讲清 ABC 与 ABCMeta 的区别：一个是便捷基类，一个是元类；分别适合接口约束与类创建期的自动注入/校验。</description></item><item><title>以业务对象为核心的 Python 架构实践</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-business-object-first-architecture/</link><pubDate>Mon, 01 Dec 2025 11:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/python-business-object-first-architecture/</guid><description>通过一个工单（Ticket）示例，讲解在 Python + FastAPI + SQLAlchemy 项目中，如何先定义清晰的业务对象（领域模型），再围绕它设计接口 DTO、仓储抽象和应用服务，避免业务代码直接围绕表结构和框架 API 打转。</description></item><item><title>从表结构到领域模型：用聚合仓储设计权限系统</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/permission-architecture-aggregate-repository/</link><pubDate>Mon, 01 Dec 2025 10:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/permission-architecture-aggregate-repository/</guid><description>本文通过 FastAPI + SQLAlchemy + Alembic 的权限组管理示例，讲解如何用领域模型和仓储抽象设计权限系统，为什么仓储可以一次操作多张表，以及 service 层和 repository 层各自应该承担的职责。</description></item><item><title>让 FastAPI 异步真正‘不卡’：asyncio.create_task + to_thread 并发实践（含 MySQL 写入）</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/fastapi-asyncio-create-task-to-thread-mysql/</link><pubDate>Wed, 19 Nov 2025 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/fastapi-asyncio-create-task-to-thread-mysql/</guid><description>把同步重活丢给线程、把可并行的子流程拆出来并发执行，让 FastAPI WebSocket/HTTP 服务在高并发文件处理场景下保持流畅与可靠。</description></item><item><title>现代加密替代方案：AES‑GCM 与 ChaCha20‑Poly1305 实战指南（附 Python 示例）</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/modern-crypto-aes-gcm-chacha20-poly1305-guide/</link><pubDate>Wed, 19 Nov 2025 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/modern-crypto-aes-gcm-chacha20-poly1305-guide/</guid><description>聚焦现代 AEAD：为何替代 RC4、如何安全落地 AES‑GCM 与 ChaCha20‑Poly1305，附可复制的 Python 代码与最佳实践。</description></item><item><title>用 Python 还原 RC4 + JWT + 自定义 SSO Token 加解密（含可运行示例）</title><link>https://jeanphilogong.github.io/jeanblog/zh/dev/python/recreate-rc4-jwt-custom-sso-token-in-python/</link><pubDate>Wed, 19 Nov 2025 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/dev/python/recreate-rc4-jwt-custom-sso-token-in-python/</guid><description>从核心概念到可运行代码，演示用 Python 实现 RC4 加/解密、JWT 与自定义 SSO Token，并讨论风险与替代方案。示例中密钥与发行方均为占位值。</description></item></channel></rss>