不常用到参数匹配的全部功能,容易忘掉,做个笔记总结一下,备查:
参数匹配模型:位置参数,关键字参数,默认参数,可变参数(字符 * )开头,可变参数解包,Keyword-only 参数
函数调用时:
func(value),
func(name=value),
func(*sequence), 调用过程中解包为分开的,单个的参数
func(**dict), 调用过程中解包为分开的,单个的参数
函数定义时:
def func(name), 基于位置或者变量名
def func(name=value), 默认参数值
def func(*name), 收集任意的额外不匹配的参数到元组中,
def func(**name), 收集任意的额外不匹配的参数到字典中,
def func(*args, name), *args 之后的 name 参数就是 Keyword-only 参数,必须在调用中按照关键字传递
def func(*, name=value), ( python 3.0 ), * 之后的 name 参数就是 keyword-only 参数,必须在调用中按照关键字传递
函数调用中,参数必须以下列顺序出现:位置参数,关键字参数和 *sequence 形式组合,**dict 形式参数
函数定义时,参数必须以下列顺序出现:一般参数,默认参数,*name 或者 * 形式参数, name 或者 name=value keyword-only 参数, **name 形式参数
所以,不论是在函数调用中,还是在函数定义中,**arg 形式参数都必须出现在最后
Python 内部的参数匹配规则:
1. 通过位置分配非关键字参数;
2. 匹配关键字参数;
3. 其他额外的非关键字参数分配到 * name 元组中
4. 其他额外的关键字参数分配到 **name 字典中
5. 用默认值分配给在头部未得到分配的参数