定义函数时,*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)装饰器、代理函数、写一层薄封装时都靠这个。记住两对星星:一颗收/发元组,两颗收/发字典。