Python Function Parameters

今天是周日, 简单写点吧, 简单总结一下 Python 中函数参数 Python Function Parameters Python 函数参数机制非常灵活丰富, 理解各种参数类型及其用法对于写出优雅、易维护的代码非常重要. 本文将介绍 Python 中函数参数的种类与用法, 并详细讲解 Python 3.8 引入的参数分隔符 / 和 *, 帮助你更好地设计函数接口. 1. Postional Arguments 位置参数 函数定义中最常见的参数, 调用时按顺序传入值 def greet(name, age): print(f"Hello, {name}. You are {age} years old.") greet("Alice", 30) # Hello, Alice. You are 30 years old. 2. Keyword Arguments 关键字参数 调用时以 key=value 形式传入, 顺序可变 greet(age=30, name="Alice") 3. Default Arguments 默认参数 定义函数时给参数赋默认值, 调用时可省略 def greet(name, age=20): print(f"Hello, {name}. You are {age} years old.") greet("Bob") # 使用默认年龄20 greet("Bob", 25) # 指定年龄 注意: 使用默认参数尽量不要使用可变类型(mutable), 例如列表, 因为默认参数是存储在函数中的, 而非函数实例中, 多次调用会改变默认值的内容. def greet(names: list[str] = ["Alice", "Bob"]): ... 若希望使用默认值, 建议使用下面这种方法 ...

August 10, 2025 · 2 min · 278 words · Starslayerx

FastAPI Body Advanced Uses

本篇文章介绍 FastAPI Request Body 的进阶用法 Body - Multiple Parameters 首先, 可以将Path, Query 和 request body 参数声明自由的写在一起 对于 request body 参数可以是可选的, 并且可设置为默认的 None from typing import Annotated from fastapi import FastAPI, Path from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str description: str | None = None price: float tax: float | None = None @app.put("/items/{item_id}") async def update_item( item_id: Annotated[int, Path(title="The ID of the item to get", ge=0, le=1000)], # Path q: str | None = None, # Query item: Item | None = None, # body ): results = {"item_id": item_id} if q: results.update({"q": q}) if item: results.update({"item": item}) return results Multiple body parameters 多参数请求体 在上面例子中, FastAPI 期望一个包含 Item 属性的 JSON body, 例如 { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 } 但也可以声明多个body parameters, 例如 item 和 user ...

August 9, 2025 · 5 min · 911 words · Starslayerx

Git Whitelist

有时你开启了一个新的项目, 运行了 cargo init、uv init 和 go mod init 这些命令创建了工作所需要的必要文件, 同时也在 .gitignore 文件中添加了以下内容 target __pycache__ bin 一切都很顺利, 你继续开发新功能, 等到时机成熟时就将项目发布到了 Git 托管平台上 人们开始对你的项目感兴趣, 甚至有人决定为你实现一个新功能, 这简直是免费劳动力! 当你查看代码, 发现了一个格格不入的文件 .DS_Store, 你问那个人这是什么, 他说他根本不知道 然后你只是将该文件从分支里面删除, 并把文件名加入了仓库的 .gitignore target __pycache__ bin .DS_Store 现在代码合并到了 main, 仓库里只包含有用的内容 接着, 另一人使用基于 Web 技术的 IDE 提交了另一个合并请求, 一看发现有一个完全无关的目录也被提交了, 于是 .gitignore 里又增加了一条内容 target __pycache__ bin .DS_Store .vscode 接下来, 有人使用 IntelliJ IDEA 提交了五百个 XML 文件和 .idea 目录, 这时又不得不将其加入 .gitignore target __pycache__ bin .DS_Store .vscode .idea 多年后, .gitignore 已经有了上百行, 但是仍然时不时有各种奇怪的文件, 例如 testscripts、foo、a、qux、data.tar.gz、start.sh、cat …… ...

August 8, 2025 · 1 min · 127 words · Starslayerx

FastAPI Parameters and Validations

这篇文章介绍 FastAPI 中的参数验证功能 Query Parameters and String Validations FastAPI 允许为参数声明额外的信息和验证规则 from fastapi import FastAPI app = FastAPI() @app.get("/items/") async def read_items(q: str | None = None): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: results.update({"q": q}) return results q 是类型为 str | None 的查询参数, 这意味着它可以是字符串, 也可以是 None. 其默认值是 None, 因此 FastAPI 会识别它为“可选参数” FastAPI 通过 = None 的默认值知道该参数是非必填的 使用 str | None 还能帮助编辑器提供更好的类型提示和错误检测 Additional validation 额外验证 即使 q 是可选的, 但仍然可以设置条件: 如果提供了 q, 则长度不能超过50个字符 使用 Query 和 Annotated 来实现 from typing import Annotated from fastapi import FastAPI, Query app = FastAPI() @app.get("/items/") async def read_items(q: Annotated[str | None, Query(max_length=50)] = None): results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]} if q: results.update({"q": q}) return results 使用 Annotated 包装后, 就可以传递额外的元数据(Query(max_length=5)), 用于校验或者文档 ...

August 7, 2025 · 4 min · 779 words · Starslayerx

FastAPI Parameters

FastAPI 是一个现代、快速(高性能)的 Python Web 框架, 它自动处理参数的解析、验证和文档生成 本文将介绍 FastAPI 中三类最常用的参数: 路径参数 (Path Parameters)、查询参数 (Query Parameters) 和 请求体(Request Body) 的用法与原理 1. Path Parameters 路径参数 路径参数是 URL 路径中的动态部分, 使用 {} 包裹表示 from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") async def read_item(item_id: str): return {"item_id": item_id} 访问 /items/foo 返回: {"item_id": "foo"} Data conversion & validation 类型声明与自动转换 可以为路径参数声明类型, FastAPI 会自动解析并验证: @app.get("/items/{item_id}") async def read_item(item_id: int): return {"item_id": item_id} 访问 /items/3, item_id 会被转换为 int 类型 Routing orders 路由匹配顺序 路径匹配按声明顺序执行, 例如 @app.get("/users/me") async def read_user_me(): return {"user_id": "current_user"} @app.get("/users/{user_id}") async def read_user(user_id: str): return {"user_id": user_id} 必须先声明 /users/me, 否则会被 /users/{user_id} 捕获 ...

August 6, 2025 · 3 min · 525 words · Starslayerx

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