我有以下代码:
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.)
由于
答案 0 :(得分:2)
是的,Python对参数强制执行命令:所有非关键字参数必须首先出现,然后是任何关键字参数。
答案 1 :(得分:2)
icktoofay是正确的,但我认为在这个问题上进一步深入可能会有所帮助。这样做的原因是如果你允许使用关键字参数,然后是位置参数,那么它本身就会变得模糊不清,因为参数应该实际进入哪个位置。它应该计算关键字参数吗?
在你的例子中:
say_hello_then_call_f(g, 1, y=2, 4, z=5.)
有4
作为4th
和3rd
位置参数的情况。如果将关键字参数计为位置参数,则没有理由指定与参数关联的单词,如果不指定,则有效地为该函数提供非常量接口。
此外,很难说它是在*args
还是**kwargs
。
除此之外,如果我们将参数歧义与python
的鸭子打字系统结合起来,它很快就会导致一些调试可怕的问题。