Python的关键字参数与斜杠“/”
Python3.8 新增了一种语法,可以使用斜杠 /
占据一个参数的位置,表示在此之前的参数都只接受位置参数的传参形式。
例如,对以下函数声明:
def func(a, b, /, c, d, *, e, f):
pass
那么参数 a
和 b
都只能以位置参数的形式传入,参数 e
和 f
都只能以关键字参数的形式传入,而 c
和 d
则不受限制,可以按任意形式传入参数。因此,调用该函数时,前两个参数必定代表 a
和 b
,并且必定存在 e=...
和 f=...
的关键字参数。
如果查阅 Python 内置函数 divmod()
的帮助,可以看到:
>>> help(divmod)
Help on built-in function divmod in module builtins:
divmod(x, y, /)
Return the tuple (x//y, x%y). Invariant: div*y + mod == x.
这表明 divmod()
的两个参数都只支持按位置形式传参的方法。
除此之外,斜杠 /
还可以用作区分普通的关键字参数与可变关键字参数,考虑以下函数定义:
def func(name, **kw):
print(name, kw)
那么以下调用:
func('hello', name='world')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: func() got multiple values for argument 'name'
是错误的,因为 Python 解释器会认为参数 name
既当位置参数使用,又当关键字参数使用,还没有处理到可变参数 **kw
,就会直接引发异常。
但如果在定义函数时,在两者之间加上一个斜杠 /
占据的参数位置,那么参数 name
就只能当位置参数使用,此时再次以同样方式调用函数,就不会发生歧义了:
>>> def func(name, /, **kw):
... print(name, kw)
...
>>> func('hello', name='world')
hello {'name': 'world'}
这样,参数传递时 name='world'
只能被解释为关键字参数,正好被可变参数 **kw
接纳。