Python Tricks

1. The Self-Replicating Trick 将一个含有空列表的列表乘5, 得到有5个空列表的列表 x = [[]] * 5 x [[], [], [], [], []] 当使用.append("x")方法时, 所有列表都被修改 x[0].append("x") x [[“x”], [“x”], [“x”], [“x”], [“x”]] 打印其 id 可以看到, id 都相同 for item in x: print(id(item)) 4417579584 4417579584 4417579584 4417579584 4417579584 或者使用set()发现 id 唯一 set(id(item) for item in x) {4417579584} 也就是说, 当使用乘法的时候, 创建了5个内部列表的引用副本 使用反汇编发现, 只创建了两个列表, 并执行乘5 dis.dis("[[]] * 5") 0 0 RESUME 0 # 用于支持解释器恢复 (py3.11) 1 2 BUILD_LIST 0 # 构造一个空列表[], 压栈 4 BUILD_LIST 1 # 从栈顶取一个对象, 构造列表[[]] 6 LOAD_CONST 0 (5) # 加载常量 5 8 BINARY_OP 5 (*) # 对栈顶两个元素执行乘法 12 RETURN_VALUE # 返回栈顶结果 The alternative 如果要构造独立列表, 应改用列表推导式 ...

August 5, 2025 · 3 min · 432 words · Starslayerx

Executing arbitrary Python code from a comment

通过注释执行任意Python代码 问题描述 Q: 只能控制一行的.py代码中注释的内容(\n\r均会被替换为空字符), 如何执行任意代码? A: 在注释#中, 构造一个.zip 文件, python 会将该内容当成一个 zip 包执行, 触发任意代码执行 解决方案 从 Python 3.5 起, 可以直接执行一个 .zip 文件 python myapp.zip 前提是ZIP 包中包含一个顶层的__main__.py文件, Python 会把它当作 zipapp, 自动解压并运行__main__.py Python 会从末尾找到 ZIP 的目录结构, 而不是依赖文件头, 所以前面的“垃圾”字节会被忽略 Python 源码中的任何行, 只要以 # 开头, 解释器都会忽略后面内容, 因此可以: 把 ZIP 文件的数据藏在 Python 源码中的注释中(开头加 #) 把 ZIP 数据直接拼接在 Python 文件的后面, 只保证文件头部分是合法 Python ZIP 不关心前缀, Python 只要最前面是有效源码, 也不会管后面 难点 ZIP 文件头包含二进制字段,比如 偏移量(文件数据相对于 ZIP 开头的位置) 长度(文件名长度、注释长度等) 这些值写死在 header 里, 是十六进制整数 如果这些字节中出现了像 \x00、\xFF 等非 ASCII 内容, Python 就不能把它当注释 解决方法: 暴力穷举合法组合 ...

August 4, 2025 · 3 min · 563 words · Starslayerx

How FastAPI Works

FastAPI 的工作原理: 从 routing 到 lifecycle 以及在现实中的使用 FastAPI FastAPI 是一个现代的 Python Web 框架, 注重高性能和开发效率. 旨在帮助开发者编写结构清晰、可靠的API, 同时尽量减少样板代码 (boilerplate) 其由以下两个库驱动: Starlette: 负责 Web 服务器逻辑、路由、中间件和异步能力 Pydantic: 基于 Python 类型提示, 处理数据验证、解析和序列化 此外, Fastapi 还有输入验证、基于 Swagger UI 的自动文档生成和代码清晰化的基础 API 请求周期 Fastapi 的请求生命周期如下 客户端请求 (Client Request) ↓ FastAPI App ↓ 中间件(Middleware) ↓ 路由匹配 (Route Matching) ↓ 依赖注入(Dependency Injection) ↓ 输入验证 (Input Validation) ↓ 端点函数 (Endpoint) ↓ 响应序列化 (Response Serialization) ↓ 客户端响应 (Client Response) 请求首先进入 FastAPI 应用 (本质就是一个 Starlette 应用) 所有中间件优先执行 (如: 日志、错误处理、CORS等) 路由器检查路径和方法, 找到对应的处理函数 FastAPI 使用Depends解析依赖 使用 Pydantic 自动解析并验证输入数据 执行端点函数, 参数验证完毕 返回结果被序列化为合适的响应格式 (JSON) 响应返回给客户端 路由 Router 在应用对象上定义 适合小项目或原型验证 ...

August 3, 2025 · 2 min · 322 words · Starslayerx

"Chaos Enginnering" In Partice

记录一个小故事 “混沌工程”实践 项目延期,开发说时间不够干不完 老板:“不够就招人” 今天偶然听到旁边同事给新来的员工做code review: Q:你这个代码不要这样写,因为…… A:哦,懂了 Q:唉?你这个 .idea/ 文件是什么? A:啊?我也不知道 我:不是???(一脸震惊) 理想:Plan Do Check Act 现实:Plan Delay Cancel Apologize

August 2, 2025 · 1 min · 21 words · Starslayerx

Blaugust

🎈 Oh hello, August! It’s time for Blaugust. Blaugust Begins: Writing as a Develpoer Habit This year, I’m joining Blaugust - a month-long blogging challenge that encourage consistent writing throught August. For develpoers, blogging isn’t just sharing, it’s about orgainzing thoughts, documenting ideas, and creating term references. What I Plan to Write Here is what I aim to cover this month: Daily dev partices: tools, logging, project structure patterns Python ecosystem: FastAPI, Pydantic, Langchain, Pytest and more AI project logs: buliding AI agents and orchestration workflows Architecture notes: async patterns, micorservice, data flow Learning notes & translation of blogs: deep dive into code and quality tech atricles I’m not necessarily writing one post per day - some days I might write multiple posts in advance - but the goal is to publish daily with a focus on consistency, reusability, and value. ...

August 1, 2025 · 1 min · 189 words · Starslayerx

Dive into DeepLearning - 02 - Preliminaries

Course Note: d2l-video-05 - 线性代数 Jupyter Notebook: chapter_preliminaries/linear-algebra.ipynb 预备知识中 Liner Algebra 的部分 线性代数 Scalars 标量: 指只有一个元素的张量 tensors import torch x = torch.tensor(3.0) # scalar y = torch.tensor(2.0) Vectors 向量: 可以视作标量构成的列表 x = torch.arange(4) x[3] # 通过张量索引访问任一元素 len(x) # 访问张量长度 x.shape # torch.Size([4]) 只有一个轴的张量, 形状只有一个元素 Matrices 矩阵: 类似向量的推广, 可以构建更多轴的数据结构 # 构建矩阵 A = torch.arange(20).reshape(5, 4) A.T # 转置 # 对称矩阵 B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]]) B = B.T 形状相同张量的计算 A = torch.arange(20, dtype=torch.float32).reshape(5, 4) B = A.clone() A, A + B A * B # 对应元素相乘: Hadamard 积 计算元素的和 x = torch.arange(4, detype=torch.float64) x.sum() # 任意形状张量的和 计算平均值 A.mean() # 均值 A.sum() / A.numel() # 另一种计算均值的方法: 和 / 数量 点乘是相同位置元素乘积的和 ...

March 21, 2021 · 2 min · 307 words · Starslayerx

Dive into DeepLearning - 01 - Preliminaries

Course Note: d2l-video-04 - 数据操作+数据预处理 Jupyter Notebook: chapter_preliminaries/pandas.ipynb 预备知识中 Data Manipulation 和 Data Preprocessing 的部分 介绍 N 纬数组介绍 0-d (标量) 1.0 一个类别 1-d (向量) [1.0, 2.7, 3.4] 一个特征向量 2-d (矩阵) [[1.0, 2.7, 3.4], [1.0, 2.7, 3.4], [1.0, 2.7, 3.4]] 一个样本 - 特征矩阵 3-d RGB 图片(宽 x 高 x 通道) [[[1.0, 2.7, 3.4], [1.0, 2.7, 3.4], [1.0, 2.7, 3.4]], [[1.0, 2.7, 3.4], [1.0, 2.7, 3.4], [1.0, 2.7, 3.4]]] 4-d 一个 RGB 图片批量 (批量大小 x 宽 x 高 x 通道) ...

March 21, 2021 · 3 min · 566 words · Starslayerx