理解python3函数中的'*'"仅关键字"参数表示法

kma*_*729 6 python keyword-argument python-3.x

当与partial一起使用时,我在python3中遇到关键字唯一参数功能的一些困难行为.关于仅关键字参数的其他信息.

这是我的代码:

def awesome_function(a = 0, b = 0, *, prefix):
    print('a ->', a)
    print('b ->', b)
    print('prefix ->', prefix)
    return prefix + str(a+b)
Run Code Online (Sandbox Code Playgroud)

以下是我对部分的理解:

>>> two_pow = partial(pow, 2)
>>> two_pow(5)
32
>>>
Run Code Online (Sandbox Code Playgroud)

我在上面的例子中理解的是,partial使第二个参数pow作为唯一的参数two_pow.

我的问题是为什么以下工作:

>>> g = partial(awesome_function, prefix='$')
>>> g(3, 5)
a -> 3
b -> 5
prefix -> $
'$8'
>>>
Run Code Online (Sandbox Code Playgroud)

但我得到的错误是:

>>> awesome_function(prefix='$', 3, 5)
  File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>>
Run Code Online (Sandbox Code Playgroud)

我知道我可以awesome_function直接打电话

>>> awesome_function(prefix='$', a = 3, b = 5)
a -> 3
b -> 5
prefix -> $
'$8'
>>>
Run Code Online (Sandbox Code Playgroud)

the*_*eye 5

根据Python中函数调用的语义,要传递的参数的规则如下

argument_list   ::=  positional_arguments ["," keyword_arguments]
                       ["," "*" expression] ["," keyword_arguments]
                       ["," "**" expression]
                     | keyword_arguments ["," "*" expression]
                       ["," keyword_arguments] ["," "**"     expression]
                     | "*" expression ["," keyword_arguments] ["," "**" expression]
                     | "**" expression
Run Code Online (Sandbox Code Playgroud)

如您在此处看到的,位置参数应始终出现在函数调用的开头。它们不能出现在其他任何地方。当你做

awesome_function(prefix='$', 3, 5)
Run Code Online (Sandbox Code Playgroud)

它违反了上述规则,因为您在关键字参数()之后传递了两个位置参数(3和)。这就是为什么得到一个的原因,因为Python无法解析函数调用表达式。5prefixSyntaxError


但是,当您使用partial它时,它可以工作,因为partial创建了一个新的函数对象,并且它存储了所有要传递给它的参数。当您实际调用由返回的函数对象时partial,它将首先应用所有位置参数,然后应用关键字参数。