Python2函数,默认参数报SyntaxError

问题

想弄清楚默认参数,*args,kwargs,如果混用,会怎样,但是报错(不明白它的报错含义)

表层问题描述在代码旁边了

更加深入的问题是: Python的形参是如何放置的? 传入的时候有什么讲究?

或: 是否有一篇文章,深入地从底层机制讲解这方面的问题?

相关代码

  • 代码1

以下函数报: TypeError: testfunc() got multiple values for keyword argument 'a'
def testfunc(a=1, b=2, c=3, d=4, *args):
    print a
    print b
    print c
    print d

args = (1, 2, 3, 4)
# 根据默认参数的定义
# 一般我们认为: 想怎么传就怎么传
# 但是: 结果不是我们想象的那样, 因为报错了
testfunc(a=10, b=20, c=30, d=40, *args)
testfunc(a=10, c=30, *args)
testfunc(*args)
testfunc(d=1, *args)


def test2(a=1, b=2, c=3, d=4, *args, **kwargs):
    print a
    print b
    print c
    print d

args = (1, 2, 3, 4)
kwargs = {'a': 1, 'b':2}
test2(a=10, *args, **kwargs)
  • 代码2

# 试试不加*args, **kw这些会怎样?
# 果然, 爱怎么传,就怎么传
def func(a=1, b=2, c=3, d=4):
    print a
    print b
    print c
    print d

func(d=1, c=2, b=3, a=4)
func()
func(b=4, a=1)

# 这样呢?
# 仍然不报错
def func(a, b=2, c=3, d=4):
    print a
    print b
    print c
    print d

func(d=1, c=2, b=3, a=4)
func(b=4, a=1)

# 加入*args后呢?
# 会报错
def func(a, b=2, c=3, d=4, *args):
    print a
    print b
    print c
    print d
    print args

func(d=1, c=2, b=3, a=4)
func(b=4, a=1)
func(1, 2, 3, 4, 5, 6)
func(1, b=2, d=4, 5, 6, 7)  # error
func(1, b=2, c=3, d=4, 5, 6, 7) #error

# 加入**kwargs呢, 不做举例了

至此, 可以总结点经验
1. *args, **kw对默认参数似乎有影响
2. 默认参数能乱序,但是在某些情况下
所以, 我才想要一个深层次的解答, 为上面的经验提供理论证明

重现

  1. 拷贝代码,运行之

报错信息

TypeError: testfunc() got multiple values for keyword argument 'a'

上下文环境

  1. Python2

  2. windows7

尝试解决

  1. 貌似很多: https://www.google.co.jp/sear...

阅读 3.4k
3 个回答

你的运行语句不对。testfunc(10, 20, 30, 40, *args)

python中的参数顺序,有默认值的参数,需要放在没有默认值的参数后面。
其他支持默认参数的语言也是如此。语法如此。

def func(a, b, c=1, d=2):
    # a,b 没有默认值,需要放在前面
    # c,d 有默认值,需要排在后面。
    

而对于 func(*args, **kwargs) 这种写法,args˙指的就是没有默认值的这部分,是个list。kwargs指的是有默认值的那部分,是个dict。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题