Skip to content

定义函数时,*args 和 **kwargs 用来接「还不确定有多少个」的参数。名字可以换,约定俗成写成这两个。

  • *args:多出来的位置参数,在函数里是一个元组
  • **kwargs:多出来的关键字参数,在函数里是一个字典
python
def test(a, *args, **kwargs):
    print(a)
    print(args)
    print(kwargs)

test(1, 3, 5, 7, c="2", d=4)
# 1
# (3, 5, 7)
# {'c': '2', 'd': 4}

a 吃掉第一个位置参数,剩下的无名参数进 args,c= / d= 进 kwargs。

顺序不能乱 ​

签名里必须是:普通参数 → *args → 关键字-only → **kwargs。*args 要写在 **kwargs 前面。调用时也一样,位置参数不能出现在关键字参数后面:

python
def ak(*args, **kwargs):
    print("args =", args)
    print("kwargs =", kwargs)

ak(2, 4, 6, 8)
ak(a=2, b=4)
ak(2, 4, a=1, b=3)
# SyntaxError: positional argument follows keyword argument
# ak("a", a=1, 1)

转发出去 ​

收集来的参数可以原样传给下一个函数:

python
def outer(*args, **kwargs):
    inner(*args, **kwargs)

装饰器、代理函数、写一层薄封装时都靠这个。记住两对星星:一颗收/发元组,两颗收/发字典。

测试开发工程师 · 专注自动化与系统架构 | 邮箱: hansblog@atumsoul.win