在 python 函数调用中混合关键字参数和 * 元组的规则是什么

What are the rules for mixing keyword argument and * tuple in python function call

我很难理解在 python 函数调用中混合关键字参数和 *tuple 的规则

更具体地说是关于下面的代码片段

def  func(a,b,c):
    print("These are the arguments",a,b,c)

args = [2]
#Case 1: expected output "These are the arguments:1,2,3" works fine
func(1,c=3,*args)

#Case 2:expected output "These are the arguments:1,3,2" raises TypeError
func(1,b=3,*args)

我想了解为什么案例 1 有效但案例 2 引发了 TypeError: func() got multiple values for argument 'b'

根据 language reference doc 在我看来,上述关键字参数和 *tuple 的混合形式是有效的。对不起,如果我遗漏了一些明显的东西。

在 3.4 和 2.7.6 上测试。

关键字参数在评估位置参数时不计算在内,因此在后一种情况下,您尝试提供两次 b,一次使用关键字参数,一次使用位置参数。以下方法调用是等效的:

func(1, b=3, *args)
func(1, *args, b=3)

顺便说一句,链接文档中显示了一个非常相似的示例,就在带有 CPython 实现细节的框架下。