作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] function argument *
时间Sat Dec 13 14:40:28 2014
※ 引述《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
1F:→ akasan:valgrind, 但 windowns 版的没试过XD 11/02 00:43
2F:→ akasan:linux 上那真的是不二选择了 11/02 00:44
3F:→ Linux:我是用 Windows ....>"< 11/02 00:45
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.161.94.175
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1418452831.A.4CF.html
※ 编辑: uranusjr (218.161.94.175), 12/13/2014 14:44:27
4F:→ walelile: 原来如此,谢谢u大的解释 12/13 14:49
5F:推 kipi91718: 长知识了 12/17 22:43