Python基础之只接收关键字参数的函数

当我们希望函数的某些参数强制使用关键字参数时,可以将强制关键字参数放到某个*后面就能得到这种效果。比如:

def recv(maxsize, *, block):
    """接收一条消息"""
    pass
recv(1024, True)        #错误写法会产生TypeError错误
#TypeError: recv() takes 1 positional argument but 2 were given

recv(1024, block=True)  #正确

使用这种方法,我们还能在接受任意多个位置参数的函数中指定关键字参数。比如:

def mininum(*values, clip=None):
    m = min(values)
    if clip is not None:
        m =clip if clip > m else m
    return m

ret1 = mininum(1, 5, 2, -5, 10)
print(ret1)                     #ret1 = -5
ret2 = mininum(1, 5, 2, -5, 10, clip=0)
print(ret2)                     #ret2 = 0

在很多情况下,使用强制关键字参数会比使用位置参数表意更加清晰,程序也更加具有可读性。例如,考虑一下下面这个函数调用:

msg = recv(1024, False)

如果调用者对recv函数不是很熟悉,那么调用者就会不明白那个False参数是用来干嘛的。

但是,如果代码变成下面这样,就清楚很多了。

msg = recv(1024, block=False)

另外,使用强制关键字参数也会比使用**kwargs参数更好,因为在使用函数help的时候输出也会更容易理解:

>>>help(recv)
Help on function recv in module __main__:
recv(maxsize, *, block)
    接受一条信息

强制关键字参数在一些更高级场合同样也很有用。

比如说,它们可以被用来在使用*args和**kwargs参数作为输入的函数中插入参数。

 

posted @ 2018-11-25 14:11  _杨魏  阅读(1142)  评论(0编辑  收藏  举报