本篇我们学习 Python 可变关键字参数(**kwargs)的概念和作用。

可变关键字参数

在 Python 中,函数的参数前面可以使用两个星号(**)作为前缀,例如 **kwwargs。这种参数被称为关键字参数(keyword parameter)。

当函数包含 **kwargs 参数时,它可以接受数量可变的关键字参数,这些参数组成了一个字典。

按照惯例,这种参数的名字通常使用 kwargs。不过,我们也可以使用其他任何有意义的名字,例如 **configs 或者 **files。

以下示例中的函数 connect() 定义了一个可变关键字参数 **kwargs:

def connect(**kwargs):
    print(type(kwargs))
    print(kwargs)

下面的代码调用了该函数,打印了一个空的字典:

connect()
<class 'dict'>
{}

以上示例中,我们没有传递任何参数到 connect() 函数,因此 kwargs 时一个空字典。

以下示例调用 connect() 函数时传递了一些关键字参数:

connect(server='localhost', port=3306, user='root', password='Py1hon!Xt')

输出结果如下:

<class 'dict'>
{'server': 'localhost', 'port': 3306, 'user': 'root', 'password': 'Py1hon!Xt'}

在 connect() 函数内部,我们可以将 kwargs 参数当作一个字典使用。

如果我们想要将一个字典传递给该函数,需要在实参前面加上两个星号,例如:

def connect(**kwargs):
    print(kwargs)


config = {'server': 'localhost',
        'port': 3306,
        'user': 'root',
        'password': 'Py1thon!Xt12'}

connect(**config)

如果函数同时包含 **kwargs 参数和其他参数,需要将 **kwargs 参数放在其他参数之后。否则,将会返回一个错误。下面的 connect() 函数定义是正确的:

def connect(fn, **kwargs):
    print(kwargs)

但是,以下函数定义将会返回 SyntaxError 错误:

def connect(**kwargs, fn):
    print(kwargs)
SyntaxError: invalid syntax

可变参数与可变关键字参数

以下函数同时包含了可变参数(*args)以及可变关键字参数(**kwargs):

def fn(*args, **kwargs):
    print(args)
    print(kwargs)

函数 fn 可以接受数量可变的位置参数,Python 会将这些参数打包成一个元组后将其赋值给 args 参数。同时,函数 fn 也可以接受数量可变的关键字参数,Python 会将这些参数打包成一个字典后将其赋值给 kwargs 参数。例如:

fn(1, 2, x=10, y=20)

输出结果如下:

(1, 2)
{'x': 10, 'y': 20}

总结

  • Python 可变关键字参数(**kwargs)允许函数接受数量可变的关键字参数。
  • 在函数内部,kwargs 参数是一个字典,包含了由所有关键字参数名称和值组成的键值对。
  • 将字典传递给 **kwargs 参数之时需要在字典名称前加上两个星号。
  • 定义函数时,**kwargs 参数只能出现在参数列表的最后,否则将会返回语法错误。