可变参数*args与**kwargs底层原理、混用顺序、生产实战
博客导语大部分开发者只会照抄*args、**kwargs不懂解包原理、混用边界、传参限制。本篇从元组/字典解包底层拆解覆盖函数定义、函数调用双向解包附带接口封装、装饰器传参两大实战场景。一、*args不定长位置可变参数1.底层原理args全称arguments*代表位置解包接收所有多余的位置参数自动打包为元组tuple。元组不可变保证参数安全。def calc_sum(*args): print(args,type(args)) return sum(args) calc_sum(1,2,3,4) # (1,2,3,4) class tuple2.调用侧单星解包调用函数时*可将列表、元组、集合打散为独立位置参数传入解决批量传参问题。data [10,20,30] calc_sum(*data) # 等价于calc_sum(10,20,30)二、**kwargs不定长关键字可变参数1.底层原理kwargs全称keyword arguments**代表关键字解包接收所有多余的关键字参数自动打包为字典dict。只能接收keyvalue格式参数。def user_detail(**kwargs): print(kwargs,type(kwargs)) user_detail(name小李,gender男) # {name: 小李, gender: 男} class dict2.调用侧双星解包调用时**打散字典转为关键字参数仅支持字典类型user {name:小张,age:24} user_detail(**user)三、所有参数强制混用顺序面试必考完整参数排序位置参数 默认参数 *args **kwargs顺序不可逆Python官方语法硬性规定def func(a,b10,*args,**kwargs): pass四、生产级实战场景通用工具函数封装不知道用户传入多少参数统一用可变参数兜底接口请求封装统一封装requests请求兼容任意请求头、请求参数装饰器万能传参适配任意被装饰函数不用修改参数结构五、新手误区纠正1.args、kwargs只是变量名可以改名*和**才是核心标识2.*args不能接收关键字参数**kwargs不能接收位置参数3.二者不能交叉传参