函数参数中的 * 是什么意思?
在函数参数中:
*的作用是:强制后面的参数只能用「关键字参数」方式传入
def f(a, b, c):
print(a, b, c)
f(1, 2, 3) # ✅
f(1, b=2, c=3) # ✅
def f(a, *, b, c):
print(a, b, c)
f(1, b=2, c=3) # ✅
f(1, 2, 3) # ❌ TypeError
📌 b 和 c 只能用关键字传参
def resolve_path(
path: str,
*,
parents: int = 0,
**kwargs,
) -> str | None:
这意味着:
path→ 位置参数parents→ 必须显式写名字kwargs→ 额外关键字参数
resolve_path("a/b/c.txt", parents=1)
resolve_path("a/b/c.txt", 1) # ❌ 不允许
📌 这是刻意设计的 API 约束
对比一下:
sendemail(smtp, sender, recipients, subject, body, True)
vs
sendemail(
smtp,
sender,
recipients,
subject,
body,
images=None,
)
💡 第二种一眼就知道每个参数是干嘛的
没有 * 的灾难场景:
def func(a, b):
...
加了参数:
def func(a, b, c=0):
...
用户代码:
func(1, 2) # OK
func(1, 2, 3) # 😬 意外改变语义
使用 *:
def func(a, *, b=0):
...
👉 API 稳定性直接拉满
def f(a, *, b, c):
...
def f(a, *args):
...
这里的 *args 是:
args == tuple(...)
def f(a, b, /, c, *, d):
...
含义:
a, b:只能位置传参c:位置 or 关键字d:只能关键字
📌 这是 Python 3.8+ 的完整参数控制模型
能加
*就加*
特别适合:
- 工具函数
- 公共库
- SDK
- 会长期维护的接口
def func(
required: str,
*,
option: int = 0,
flag: bool = False,
) -> None:
...
*不是语法糖
它是 Python 提供的 API 设计武器