参数匹配顺序——Python学习之参数(三)

参数匹配顺序——Python学习之参数(三)


这篇博文是对上一篇博文 参数匹配模型的总结与扩展。

函数参数匹配表

下面的表格总结了Python中参数匹配的语法。
在这里插入图片描述

考虑到翻译过来可能不准确,我就不翻译成中文了。

参数匹配顺序

函数调用中,参数必须以此顺序出现:任何位置参数,后面跟着任何关键字参数(name=value)和*iterable形式的组合,最后是**dict形式。

函数头部,参数必须以此顺序出现:任何一般参数(name),紧跟着任何默认参数(name=value),再然后是*name,再再然后是 keyword-only 参数(name或者name=value),最后是**name形式。

注意:在函数调用和函数头部中,如果出现**arg形式的话,都必须出现在最后

Python内部是按照以下的步骤在赋值前进行参数匹配的:

  1. 通过位置分配非关键字参数。
  2. 通过匹配变量名分配关键字参数。
  3. 其他额外的非关键字参数分配到*name元组中
  4. 其他额外的关键字参数分配到**name字典中。
  5. 用默认值分配给在头部未得到分配的参数。

keyword-only 参数的位置

在一个函数头部,keyword-only 参数必须编写在**arg之前、*arg之后(如果二者都有的话)。无论何时,一个参数名称出现在*arg之前,它应该是默认位置参数,而不是keyword-only 参数。

>>> def f(a, *b, **d, c=6): print(a, b, c, d)          # Keyword-only before **!
SyntaxError: invalid syntax
>>> def f(a, *b, c=6, **d): print(a, b, c, d)          
>>> f(1, 2, 3, x=4, y=5)                               # Default used
1 (2, 3) 6 {'y': 5, 'x': 4}
>>> f(1, 2, 3, x=4, y=5, c=7)                          # Override default
1 (2, 3) 7 {'y': 5, 'x': 4}

>>> f(1, 2, 3, c=7, x=4, y=5)                          # Anywhere in keywords
1 (2, 3) 7 {'y': 5, 'x': 4}

>>> def f(a, c=6, *b, **d): print(a, b, c, d)        # c is not keyword-only here!
>>> f(1, 2, 3, x=4)
1 (3,) 2 {'x': 4}

第1行的写法是错误的,如果c是一个keyword-only 参数,那么它必须在*b之后,**d之前,即第3行那样。

第4行和第6行是函数调用,区别是第4行采用了参数c的默认值,第6行覆盖了默认值。

第12行,c=6是一个带有默认值的位置参数,第13行的“2”覆盖了c的默认值。

在函数调用中,keyword-only 参数可以编写在*arg之前或之后,也可能包含在**arg中。

第1行,c 是一个带有默认值的keyword-only 参数。

>>> def f(a, *b, c=6, **d): print(a, b, c, d)          # KW-only between * and **
>>> f(1, *(2, 3), **dict(x=4, y=5))                    # Unpack args at call
1 (2, 3) 6 {'y': 5, 'x': 4}

>>> f(1, *(2, 3), **dict(x=4, y=5), c=7)               # Keywords before **args!
SyntaxError: invalid syntax
    
>>> f(1, *(2, 3), c=7, **dict(x=4, y=5))               # Override default
1 (2, 3) 7 {'y': 5, 'x': 4}

>>> f(1, c=7, *(2, 3), **dict(x=4, y=5))               # After or before *
1 (2, 3) 7 {'y': 5, 'x': 4}

>>> f(1, *(2, 3), **dict(x=4, y=5, c=7))               # Keyword-only in **
1 (2, 3) 7 {'y': 5, 'x': 4}

第5行,c=7 应该出现在 **dict(x=4, y=5) 之前;

第8和11行,c=7 可以出现在 *(2, 3)之后或之前;

第14行,c=7 可以出现在**dict(x=4, y=5, c=7)中。








【本系列完】

前两篇文章分别是:
参数匹配模型——Python学习之参数(二)
Python学习之参数(一)


参考资料

《Python学习手册(第4版)》,机械工业出版社

《Learning Python 5th Edition》, O’Reilly

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值