命名關鍵字參數
對於關鍵字參數,函數的調用者可以傳入任意不受限制的關鍵字參數。至於到底傳入了哪些,就需要在函數內部通過kw
檢查。
仍以person()
函數為例,我們希望檢查是否有city
和job
參數:
def person(name, age, **kw): if 'city' in kw: # 有city參數 pass if 'job' in kw: # 有job參數 pass print('name:', name, 'age:', age, 'other:', kw)
但是調用者仍可以傳入不受限制的關鍵字參數:
>>> person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)
如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,例如,只接收city
和job
作為關鍵字參數。這種方式定義的函數如下:
def person(name, age, *, city, job): print(name, age, city, job)
和關鍵字參數**kw
不同,命名關鍵字參數需要一個特殊分隔符*
,*
后面的參數被視為命名關鍵字參數。
調用方式如下:
>>> person('Jack', 24, city='Beijing', job='Engineer') Jack 24 Beijing Engineer
如果函數定義中已經有了一個可變參數,后面跟着的命名關鍵字參數就不再需要一個特殊分隔符*
了:
def person(name, age, *args, city, job): print(name, age, args, city, job)
命名關鍵字參數必須傳入參數名,這和位置參數不同。如果沒有傳入參數名,調用將報錯:
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
File "<stdin>", line 1, in <module> TypeError: person() takes 2 positional arguments but 4 were given
由於調用時缺少參數名city
和job
,Python解釋器把這4個參數均視為位置參數,但person()
函數僅接受2個位置參數。
命名關鍵字參數可以有缺省值,從而簡化調用:
def person(name, age, *, city='Beijing', job): print(name, age, city, job)
由於命名關鍵字參數city
具有默認值,調用時,可不傳入city
參數:
>>> person('Jack', 24, job='Engineer') Jack 24 Beijing Engineer
使用命名關鍵字參數時,要特別注意,如果沒有可變參數,就必須加一個*
作為特殊分隔符。如果缺少*
,Python解釋器將無法識別位置參數和命名關鍵字參數:
def person(name, age, city, job): # 缺少 *,city和job被視為位置參數 pass