正如定义所说,使用非关键字参数来关注关键字参数是不合法的。因此在第一个printName函数调用中显示错误。
但据我所知,在第二个函数中,调用reverse= False
也是关键字参数(定义:形式使用形式参数的名称绑定到实际值)
现在reverse = False
也是一个关键字参数&它遵循非关键字参数,即'FIRSTLY','LASTLY'为什么它不显示错误?
def printName(first, last, reverse):
if reverse:
print last, first
else:
print first, last
printName('FIRSTY', last='LASTLY', False) -----> this shows an error
printName('FIRSTY', 'LASTLY', reverse= False) -----> this doesn't why so
答案 0 :(得分:1)
实际的规则是,一旦使用了关键字参数,就不能使用非关键字参数。
argument list在Python语言参考中定义为
argument_list ::= positional_arguments ["," keyword_arguments]
["," "*" expression] ["," keyword_arguments]
["," "**" expression]
| keyword_arguments ["," "*" expression]
["," "**" expression]
| "*" expression ["," keyword_arguments] ["," "**" expression]
| "**" expression
在所有这些形式中,如果存在关键字参数,则它们不会跟随位置参数或非关键字参数。
答案 1 :(得分:0)
Python首先尝试填充所有有序参数,然后检查关键字参数。根据调用约定,不允许有序参数遵循关键字参数。这是不允许的,因为订单不明确。然而,这个调用约定还有其他更微妙的效果。例如,可以双重赋值给变量名,这会导致以下可能的错误:
def printName(first, last, reverse):
if reverse:
print last, first
else:
print first, last
printName('FIRSTY', 'LASTLY', last=False)
给出错误:
TypeError: printName() got multiple values for keyword argument 'last'
答案 2 :(得分:0)
首先,一些概念:
keyword argument <-> function(last = False)
non-keyword argument <-> function(False)
现在,定义:
“使用非关键字参数关注关键字参数是不合法的。”
表示非关键字参数(例如function(False)
)在关键字参数后不能(例如last = False
)。因此,在这种情况下显示错误。
请注意,这与函数调用
不匹配printName('FIRSTY', 'LASTLY', reverse= False)