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