Re: [問題] function argument *

看板Python作者 (←這人是超級笨蛋)時間9年前 (2014/12/13 14:40), 9年前編輯推噓1(101)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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,
valgrind, 但 windowns 版的沒試過XD
11/02 00:43

11/02 00:44,
linux 上那真的是不二選擇了
11/02 00:44

11/02 00:45,
我是用 Windows ....>"<
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
原來如此,謝謝u大的解釋
12/13 14:49, 1F

12/17 22:43, , 2F
長知識了
12/17 22:43, 2F
文章代碼(AID): #1KYzzVJF (Python)
討論串 (同標題文章)
文章代碼(AID): #1KYzzVJF (Python)