Re: [問題] function argument *
※ 引述《walelile (wakaka)》之銘言:
: 我看別人程式碼的時候,看到作者宣告了一個function
: def foo(a, *, b=None, **kwds):
: ....
: 請問,'*'這個參數是什麼意思?是positional arguments嗎?
: 這是在python3.4.2的程式碼裡面看到的
: 謝謝指教
這是 Python 3(忘了哪一版)開始的新語法
代表終止 positional argument list
我想你應該知道
def foo(a, b=None):
可以用下面的任一方式使用
foo(1)
foo(1, 2)
foo(1, b=2)
foo(a=1, b=2)
等等
但這有個問題。Python 會優先使用 keyword arguments,所以下面這樣
foo(1, a=2)
會變成 a=2, b=1。這可能會造成 bug,因為如果參數列很長,
foo(1)
和上面的寫法很容易讓人搞混到底哪個參數是哪個。
為了避免上面的問題,傳統的做法會這樣設計
def foo(a, **kwargs):
b = kwargs.pop('b', None)
# 後面正常處理
但這樣使用者就可以亂傳,例如
foo(1, b=2, c=3, d=4)
所以你還得判斷如果 kwargs 裡面有 c 或 d 就要怎麼辦
如果參數多起來或者 a 還有 default value 之類的會讓你很想死
所以就有了 * 這個語法。它代表「後面的參數只能作為 keyword argument 使用」
如果把宣告改成這樣
def foo(a, *, b=None):
那麼
foo(1)
foo(1, b=2)
foo(a=1, b=2)
這些都還是可以用,但
foo(1, 2)
foo(1, a=2)
就不行,因為 b 只能用 keyword argument 傳入。
當然
foo(1, c=5)
也不行,因為根本沒這個參數啊!
這樣就可以讓你設計一些更好的 API
是個好東西啊,用過了就回不去了 XD
--
作者 Linux (Windows) 看板 C_and_CPP
標題 [問題] 如何確認是否 free 對記憶體
時間 Fri Nov 2 00:14:03 2012
→
11/02 00:43,
11/02 00:43
→
11/02 00:44,
11/02 00:44
→
11/02 00:45,
11/02 00:45
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175
※ 文章網址: http://www.ptt.cc/bbs/Python/M.1418452831.A.4CF.html
※ 編輯: uranusjr (218.161.94.175), 12/13/2014 14:44:27
→
12/13 14:49, , 1F
12/13 14:49, 1F
推
12/17 22:43, , 2F
12/17 22:43, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):