Re: [問題] function argument *

作者: uranusjr (←這人是超級笨蛋)   2014-12-13 14:40:28
※ 引述《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
作者: akasan (KITO)   2013-11-02 00:43:00
valgrind, 但 windowns 版的沒試過XDlinux 上那真的是不二選擇了
作者: Linux (Windows)   2013-11-02 00:45:00
我是用 Windows ....>"<
作者: walelile (wakaka)   2014-12-13 14:49:00
原來如此,謝謝u大的解釋
作者: kipi91718 (正港台灣人)   2014-12-17 22:43:00
長知識了

Links booklink

Contact Us: admin [ a t ] ucptt.com