7.2 只接受關(guān)鍵字參數(shù)的函數(shù)

2018-02-24 15:26 更新

問(wèn)題

你希望函數(shù)的某些參數(shù)強(qiáng)制使用關(guān)鍵字參數(shù)傳遞

解決方案

將強(qiáng)制關(guān)鍵字參數(shù)放到某個(gè)參數(shù)或者當(dāng)個(gè)后面就能達(dá)到這種效果。比如:

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

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

利用這種技術(shù),我們還能在接受任意多個(gè)位置參數(shù)的函數(shù)中指定關(guān)鍵字參數(shù)。比如:

def mininum(*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

討論

很多情況下,使用強(qiáng)制關(guān)鍵字參數(shù)會(huì)比使用位置參數(shù)表意更加清晰,程序也更加具有可讀性。例如,考慮下如下一個(gè)函數(shù)調(diào)用:

msg = recv(1024, False)

如果調(diào)用者對(duì)recv函數(shù)并不是很熟悉,那他肯定不明白那個(gè)False參數(shù)到底來(lái)干嘛用的。但是,如果代碼變成下面這樣子的話就清楚多了:

msg = recv(1024, block=False)

另外,使用強(qiáng)制關(guān)鍵字參數(shù)也會(huì)比使用**kwargs參數(shù)更好,因?yàn)樵谑褂煤瘮?shù)help的時(shí)候輸出也會(huì)更容易理解:

>>> help(recv)
Help on function recv in module __main__:
recv(maxsize, *, block)
    Receives a message

強(qiáng)制關(guān)鍵字參數(shù)在一些更高級(jí)場(chǎng)合同樣也很有用。例如,它們可以被用來(lái)在使用*args和**kwargs參數(shù)作為輸入的函數(shù)中插入?yún)?shù),9.11小節(jié)有一個(gè)這樣的例子。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)