inspect python模块_Python inspect模块:仅限关键字参数

TL;DR:纯关键字参数与普通关键字参数不同。在

仅关键字参数是函数调用中*args之后和**kwargs之前的参数。作为一个示例,考虑以下通用函数头:def func(arg, *args, kwonly, **kwargs):

在上面,kwonly接受一个仅限关键字的参数。这意味着您必须在给它一个值时提供它的名称。换句话说,您必须明确地写下:

^{pr2}$

不只是传递一个值:func(..., value, ...)

为了更好地解释,请考虑上面给出的函数的这个示例调用:func(1, 2, kwonly=3, kw=4)

当Python解释这个调用时,它将:将arg分配给1,因为它在函数签名中的位置与调用中1的位置相匹配。

将2放在*args中,因为*args收集任何额外的位置参数,2是额外的。

将kwonly分配给3,因为我们已经(必要时)明确地告诉它。请注意,如果我们改为这样做:func(1, 2, 3, kw=4)

3也将放在*args中,并且由于没有为kwonly提供参数而引发TypeError(因为在本例中我们没有给它一个默认值)。

将kw=4放在**kwargs中,因为它是一个额外的关键字参数,由**kwargs收集。

下面是我上面所说的一个例子:>>> def func(arg, *args, kwonly, **kwargs):

... print('arg:', arg)

... print('args:', args)

... print('kwonly:', kwonly)

... print('kwargs:', kwargs)

...

>>> func(1, 2, kwonly=3, kw=4)

arg: 1

args: (2,)

kwonly: 3

kwargs: {'kw': 4}

>>>

>>> func(1, 2, 3, kw=4) # Should have written: 'kwonly=3'

Traceback (most recent call last):

File "", line 1, in

TypeError: func() missing 1 required keyword-only argument: 'kwonly'

>>>

基本上,您可以将只使用关键字的参数视为关键字参数,在这种情况下,必须在给参数赋值时提供参数的名称。位置值是不够的,就像普通的关键字参数一样。在>>> def func(kw=None):

... print('kw:', kw)

...

>>> func(kw=1)

kw: 1

>>> func(1) # Do not need the name in this case.

kw: 1

>>>

>>> def func(*, kwonly=None):

... print('kwonly:', kwonly)

...

>>> func(kwonly=1)

kwonly: 1

>>> func(1) # Always need the name with keyword-only arguments.

Traceback (most recent call last):

File "", line 1, in

TypeError: func() takes 0 positional arguments but 1 was given

>>>

最后,我知道有些人在想“为什么总是只有关键字的参数?”答案很简单,在某些情况下,它们可以使内容更具可读性(尤其是对于具有可变参数数的函数)。在

例如,考虑内置的max函数及其仅限关键字key参数。你觉得什么更易读?做这样的事情:max(lambda x: -x, arg1, arg2, arg3)

让人们记住max的第一个参数总是key function,或者这样做:max(arg1, arg2, arg3, key=lambda x: -x)

让每个人都明白lambda x: -x是你的关键功能。另外,使key成为一个仅限关键字的参数,允许您在不需要键函数的情况下简单地省略它:max(arg1, arg2, arg3)

而不是:max(None, arg1, arg2, arg3)

有关详细信息,请查看以下来源:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值