您的位置:首页 > 编程语言 > Python开发

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

2022-05-20 20:25 1321 查看

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
接纳。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: