Python的关键字参数与斜杠“/”

Python3.8 新增了一种语法,可以使用斜杠 / 占据一个参数的位置,表示在此之前的参数都只接受位置参数的传参形式。

例如,对以下函数声明:

def func(a, b, /, c, d, *, e, f):
    pass

那么参数 ab 都只能以位置参数的形式传入,参数 ef 都只能以关键字参数的形式传入,而 cd 则不受限制,可以按任意形式传入参数。因此,调用该函数时,前两个参数必定代表 ab ,并且必定存在 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 接纳。

posted @ 2022-05-20 20:25  冰封残烛  阅读(1858)  评论(0编辑  收藏  举报