关键字和非关键字参数的顺序

时间:2014-12-10 04:58:44

标签: python

我有以下代码:

def say_hello_then_call_f(f, *args, **kwargs):
    print 'args is', args
    print 'kwargs is', kwargs
    print("Hello! Now I'm going to call %s" % f)
    return f(*args, **kwargs)     # when calling a function, however, * unpacks a tuple and ** unpacks a dict

def g(x, y,s, z=1):
    return (x + y) / z

我不明白为什么下面的行导致错误“关键字arg之后的非关键字arg”。它是否必须是函数具有关键字参数,然后才有非关键字参数,即使在传递值时也是如此?:

say_hello_then_call_f(g, 1, y=2,4, z=5.)

由于

2 个答案:

答案 0 :(得分:2)

是的,Python对参数强制执行命令:所有非关键字参数必须首先出现,然后是任何关键字参数。

答案 1 :(得分:2)

icktoofay是正确的,但我认为在这个问题上进一步深入可能会有所帮助。这样做的原因是如果你允许使用关键字参数,然后是位置参数,那么它本身就会变得模糊不清,因为参数应该实际进入哪个位置。它应该计算关键字参数吗?

在你的例子中:

say_hello_then_call_f(g, 1, y=2, 4, z=5.)

4作为4th3rd位置参数的情况。如果将关键字参数计为位置参数,则没有理由指定与参数关联的单词,如果不指定,则有效地为该函数提供非常量接口。

此外,很难说它是在*args还是**kwargs

除此之外,如果我们将参数歧义与python的鸭子打字系统结合起来,它很快就会导致一些调试可怕的问题。