函数调用期间的关键字参数

时间:2014-09-10 02:43:13

标签: python

正如定义所说,使用非关键字参数来关注关键字参数是不合法的。因此在第一个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

3 个答案:

答案 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)