将关键字参数传递给使用位置参数定义的函数时,会产生误导(?)TypeError

Gre*_*ind 8 python arguments

在cPython 2.4中:

def f(a,b,c,d):
    pass

>>> f(b=1,c=1,d=1)
TypeError: f() takes exactly 4 non-keyword arguments (0 given)
Run Code Online (Sandbox Code Playgroud)

但:

>>> f(a=1,b=1,c=1)
TypeError: f() takes exactly 4 non-keyword arguments (3 given)
Run Code Online (Sandbox Code Playgroud)

显然,我并不是真的了解Python的函数 - 参数处理机制.有人愿意分享一下这个吗?我看到发生了什么(比如填充参数插槽,然后放弃),但我认为这会毁掉一个新手.

(另外,如果人们有更好的问题关键词 - 类似"胆量" - 请重拍)

unu*_*tbu 13

当你说

def f(a,b,c,d):
Run Code Online (Sandbox Code Playgroud)

你告诉python f需要4个位置参数.每次调用f它时必须给出4个参数,第一个值将分配给a,第二个值分配给b,等等.

你被允许f用类似的东西打电话

f(1,2,3,4)或者f(a=1,b=2,c=3,d=4),甚至f(c=3,b=2,a=1,d=4)

但在所有情况下,必须提供4个参数.

f(b=1,c=1,d=1)返回错误,因为没有提供任何值a.(0给定) f(a=1,b=1,c=1)返回错误,因为没有提供任何值d.(3)

给出的args数表示在实现错误之前python已经达到了多远.

顺便说一句,如果你说

def f(a=1,b=2,c=3,d=4):
Run Code Online (Sandbox Code Playgroud)

然后你告诉python f需要4个可选参数.如果未给出某个arg,则会自动为您提供其默认值.然后你就可以逃脱呼唤

f(a=1,b=1,c=1) 要么 f(b=1,c=1,d=1)