[Python] 令新手驚呆的 **kwargs

初學 Python,看到有些範例會有 **kwargs 的用法,一開始不知道其意義,後來才知道它就是所謂的 keyword arguments。

先看下列的程式碼,api_function 就假設是第三方設計的 API,而 func_call_api 則是我們自己維護的 function。

def api_function(a, b, c):
print a
print b
print c

def func_call_api(a, b, c):
api_function(a=a+1, b=b+1, c=c+1)

func_call_api(a=1,b=2,c=3)

這樣的程式一開始不會有什麼問題,但假設計設這個 API 的人很機車,喜歡亂改 API 的參數,把原本的 a,b,c 參數改成 a,b,c,d,e,就會造成很大的問題。

def api_function(a, b, c, d, e):
print a
print b
print c
print d
print e

def func_call_api(a, b, c, d, e):
api_function(a=a+1, b=b+1, c=c+1, d, e)

func_call_api(a=1,b=2,c=3,d=4,e=5)

從上面的程式碼,得知 API 一改,要更動的地方就會有兩個,假設我們的程式也不是那麼在意後來多加的參數,那可以用以下的寫法:

def api_function(a, b, c, d, e):
print a
print b
print c
print d
print e

def func_call_api(a, b, c, **kwargs):
api_function(a=a, b=b, c=c, **kwargs)

func_call_api(a=1,b=2,c=3,d=4,e=5)

雖然最後程式還是得更動,但至少幅度比較小。至於那 kwarg 是什麼,將它列印出來就會發現它是一個 dictionary object,內容會是 {‘e’: 5, ‘d’: 4}。對於一直以來只寫 C# 的我而言,這類的寫法的確是相當的新鮮,也讓程式的維護較為簡單。

廣告

One thought on “[Python] 令新手驚呆的 **kwargs

  1. 但是這種 kwargs 的寫法有好有壞,好處是如你文章中所提到的,壞處則是使用者對於這個 function 所需要輸入的參數掌握度變差了,除非你完全不拿 kwargs 裡面的東西,一旦有需要,你就變成需要從一個 dict 裡面取值,所以程式很可能就會變成 kwargs.get(‘my_key’) 來取出你要的東西,後續的維護者,可能就必須進入到 code 挖掘,才比較能夠知道要傳什麼樣的值進去,也就很有機會讓程式產生 exception。所以在使用這個方式時,如何拿捏 function 的設計也是一件頗困難的事情。

    按讚數

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s