7.2 �接�关键字�数的函数¶

问题¶

你希望函数的�些�数强制使用关键字�数传递

解决方案¶

将强制关键字�数放到�个*�数或者�个*��就能达到这�效果。比如:

def recv(maxsize, *, block):
    'Receives a message'
    pass

recv(1024, True) # TypeError
recv(1024, block=True) # Ok

利用这�技术,我们还能在接�任�多个�置�数的函数中指定关键字�数。比如:

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

minimum(1, 5, 2, -5, 10) # Returns -5
minimum(1, 5, 2, -5, 10, clip=0) # Returns 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)
    Receives a message

强制关键字�数在一些更高级场��样也很有用。 例如,它们�以被用�在使用*args和**kwargs�数作为输入的函数中�入�数,9.11�节有一个这样的例�。