【学习心得】Python函数参数中的两个特殊分隔符

Python函数参数中确实有两个特殊的分隔符:

  • / :仅位置参数 ,放在 / 之前的参数只能按位置传递。
  • * :仅关键字参数 ,放在 * 之后的参数只能按关键字传递。

他们可以单独使用,也可以组合使用,完整语法如下

python 复制代码
def func(pos_only, /, normal, *, kw_only):
    pass
区域 传参方式 示例
a, b 只能按位置 func(1, 2, ...)
c, d 位置或关键字均可 func(1, 2, 3, 4, ...) 或 func(1, 2, c=3, d=4, ...)
e, f 只能按关键字 ..., e=5, f=6)

(一)/ 之前仅位置参数

/ 之前的参数只能使用位置传参禁止使用关键字传参。 它在Python3.8版本引入。

python 复制代码
def greet(name, /, greeting="Hello"):
    print(f"{greeting}, {name}!")

# 正确
greet("Alice")                # Hello, Alice!
greet("Alice", "Hi")          # Hi, Alice!
greet("Alice", greeting="Hi") # Hi, Alice!

# 错误!name 是仅位置参数
greet(name="Alice")           # TypeError: greet() got some positional-only arguments passed as keyword arguments: 'name'

(二)* 之后仅关键字参数

* 之后的参数必须使用关键字传参。

python 复制代码
def create_user(name, *, age, email=None):
    ...

# 正确
create_user("Alice", age=30)
create_user("Alice", age=30, email="a@b.com")

# 错误!age 和 email 是仅关键字参数
create_user("Alice", 30)              # TypeError: takes 2 positional arguments but 3 were given
create_user("Alice", 30, "a@b.com")   # 同上

【注】/ 和 * 本身不是参数,它们只是分隔符。/ 不能在 * 后面。lambda 不支持 /,但 lambda 支持 *

相关推荐
x10n91 小时前
微软 VC++ 运行库合集VCRedistPack
开发语言·c++·microsoft·vc++运行库·dll报错
qz_Serene1 小时前
C++:string(底层,常用接口,具体题目,模拟实现)
开发语言·c++
NiceBlueChai1 小时前
Qt 跨线程传递多容器嵌套结构:一次 Release 实测
开发语言·qt
念何架构之路1 小时前
go-grpc逻辑架构图
开发语言·后端·golang
SEO_juper1 小时前
AI 爬虫 robots.txt 检查工具:你的站是不是把 AI 挡在门外了
开发语言·人工智能·爬虫·python·外贸独立站
木圭的AI时代指南1 小时前
实测 MiniMax M3.1 Flash:同一道 Three.js 大题,两个 agent 差出 4.6 倍
开发语言·javascript·ecmascript
星恒讯工业路由器1 小时前
工业路由器在中小 IoT 场景的选型与适配实践:从标准品到定制化的技术路径
开发语言·网络·物联网·php·工业路由器选型·工业网关odm·链路冗余切换
看我debug1 小时前
Android 运行时分析工作台 (Demo)。统一管理 Frida 脚本、自动注入(修改运行时代码)、收集结构化结果、生成 JSON 报告。
android·python·pip
染指11101 小时前
151.Agent-LangGraph-Send发送(Map-Reduce模式)
人工智能·python·langchain·状态模式·agents