A007.args和kwargs
文章目录
问题: Python 中 *args 和 **kwargs
👇 点击展开/折叠 面试背诵模板(建议先背这个)
基础用法示例
1 | def demo(a, b, *args, **kwargs): |
参数定义的顺序规则
函数参数必须按以下顺序定义,否则会报语法错误:
- 普通位置参数(必填)
- **
*args**(收集多余位置参数) - 默认参数(有默认值的参数)
- **
**kwargs**(收集多余关键字参数)
1 | def correct_order(pos1, pos2, *args, default="默认", **kwargs): |
打包(定义时) vs 解包(调用时)
| 场景 | 符号 | 作用 | 示例 |
|---|---|---|---|
| 定义函数(打包) | *args |
将多余位置参数打包为元组 | def f(*args): |
| 定义函数(打包) | **kwargs |
将多余关键字参数打包为字典 | def f(**kwargs): |
| 调用函数(解包) | *list |
将列表/元组拆解为位置参数 | f(*[1,2,3]) |
| 调用函数(解包) | **dict |
将字典拆解为关键字参数 | f(**{'a':1, 'b':2}) |
1 | # 解包示例:调用时展开序列和字典 |
典型应用场景
- 装饰器:将
*args, **kwargs传递给被装饰函数,确保通用性。 - 子类初始化:调用
super().__init__(*args, **kwargs)时,将父类不关心的参数传递下去。 - API 封装:编写通用请求函数时,将额外参数通过
**kwargs转发到底层库。 - 参数收集:不确定用户会传入多少个参数时(如求和函数)。
1 | # 装饰器场景 |
常见陷阱与注意点
*args名字可任意命名,关键在于*前缀,如*params也合法,但遵循约定不用。**kwargs若未传入任何关键字参数,kwargs 为空字典{};*args同理为空元组()。- **不能同时使用两个
*args或两个**kwargs**,会引发语法错误。 - 解包时字典键名必须与函数参数名匹配,否则抛出
TypeError。 - 在函数调用中使用
*解包时,若列表长度与函数形参数量不一致,会报错。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LGQ的博客!