@
zungmou 刚刚开了一下电脑, 试了一下, 我发现我之前的说法错了。
1. keyword-only argument 指的应该是
func(a,b,c,*args, b) 这种用法。
def func(a,b,c,*args, d):
pass
调用时 d 必须用=的样子传入
func(1,2,3,4)
TypeError: func() missing 1 required keyword-only argument: 'd'
*args 换成 *: func(a,b,c,*,b) 也是一样的
2.但是楼主给的例子根本没有 keyword-only argument 的使用
如果是
def get(self, section, option, *args, raw=False, vars=None, fallback=_UNSET):
pass
楼主一定能看懂吧。
那直接来看 * 和 *args 的区别吧。
def func1(a,b,c,*args, d):
pass
func1(1,2,3,4,5,6,7,d=8)
# 4 , 5 , 6 , 7 会匹配*args args=[4,5,6,7]
def func2(a,b,c,*,d):
pass
func2(1,2,3,4,5,6,7,d=8)
# 4 , 5 , 6 , 7 会匹配* 报错
> TypeError: func2() takes 3 positional arguments but 7 positional arguments (and
1 keyword-only argument) were given
参数里面的 * 有什么意义?
我觉得是为了规范吧。
def get(self, section, option, raw=False, vars=None, fallback=_UNSET):
pass
你可以偷懒 get(section, option, False, None, _UNSET) 这样调用调用
def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
pass
你只有老老实实的 get section, option, raw=False, vars=None, fallback=_UNSET)
ps :之前的回答没斟酌,希望不要误导了。 V2EX 好像不能改原来的回复了。就再回一贴了。还有我理解错误的地方欢迎指出(>.<)