本篇我们学习 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 参数只能出现在参数列表的最后,否则将会返回语法错误。