服务公告

服务公告 > Linux命令 > 蓝易云cdn:可变参数*args 和 kwargs详解

蓝易云cdn:可变参数*args 和 kwargs详解

发布时间:2026-02-02 00:01

在 Python 里,*args 和 **kwargs 是两套“弹性入参机制”,用来把函数从“只能接固定参数”升级成“能兼容更多调用方、扩展更平滑”的可扩展接口。理解它们,你写库、写框架、写业务封装都会更稳更优雅 🚀


1) 核心定义:它们到底是什么?✅

  • *args:接收多余的位置参数,在函数内部表现为 tuple(元组)。
  • **kwargs:接收多余的关键字参数,在函数内部表现为 dict(字典)。
def f(*args, **kwargs):
    print(args, type(args))
    print(kwargs, type(kwargs))

逐行解释:

  • def f(*args, **kwargs)::表示 f 可以接任意数量的位置/关键字参数。
  • args:把调用时没被命名形参接住的“位置参数”打包成元组。
  • kwargs:把调用时没被命名形参接住的“关键字参数”打包成字典。

2) *args 详解:专管“位置参数”📦

def add_all(*args):
    total = 0
    for x in args:
        total += x
    return total

add_all(1, 2, 3)

逐行解释:

  • def add_all(*args)::允许传入任意多个数字。
  • for x in args:args 是元组,可以遍历。
  • total += x:累加每个位置参数。
  • add_all(1,2,3):这里 1、2、3 都会进入 args=(1,2,3)

适用场景:聚合计算、日志收集、批量处理、API 兼容旧调用方式。


3) **kwargs 详解:专管“关键字参数”🧾

def build_user(**kwargs):
    return {
        "name": kwargs.get("name", "unknown"),
        "age": kwargs.get("age", 0),
        "extra": kwargs
    }

build_user(name="Tom", age=18, city="Taipei")

逐行解释:

  • def build_user(**kwargs)::允许传入任意 key=value 参数。
  • kwargs.get("name", "unknown"):没有传就用默认值,避免 KeyError。
  • extra: kwargs:把剩余字段整体保留,适合“透传/扩展字段”。

适用场景:配置项、构建对象、HTTP 参数封装、插件化字段扩展。


4) 解包:* / ** 不止能“收”,还能“放” 🎯

4.1 列表/元组用 * 解包为位置参数

nums = [1, 2, 3]
print(add_all(*nums))

逐行解释:

  • *nums:把 [1,2,3] 拆成 1,2,3 传给函数。
  • add_all(*nums):等价于 add_all(1,2,3)

4.2 字典用 ** 解包为关键字参数

data = {"name": "Tom", "age": 18}
print(build_user(**data))

逐行解释:

  • **data:把字典拆成 name="Tom", age=18 的形式传参。
  • 要求:字典的 key 必须是合法的参数名字符串。

5) 参数顺序规则:写错就语法报错(务必背熟)⚠️

函数形参从左到右通常是:

  1. 普通位置参数
  2. *args(可变位置参数)
  3. 仅限关键字参数(在 * 之后声明的命名参数)
  4. **kwargs(可变关键字参数)
def demo(a, b, *args, c=0, **kwargs):
    pass

逐行解释:

  • a, b:必须传的位置参数。
  • *args:多余的位置参数进入 args。
  • c=0:只能用关键字方式传(因为在 *args 后面)。
  • **kwargs:多余关键字参数进入 kwargs(通常放最后)。

6) 真实工程用法:把参数“透传”给下游(封装常用套路)🛠️

def request_with_timeout(url, *args, timeout=3, **kwargs):
    # 假设这里内部调用一个 request(url, ...) 的底层函数
    return request(url, *args, timeout=timeout, **kwargs)

逐行解释:

  • *args, **kwargs:允许调用方继续传入底层函数支持的其它参数(例如 headers、params 等)。
  • timeout=3:你在封装层强制加一个默认策略(提升稳定性)。
  • request(..., timeout=timeout, **kwargs):把参数“原样透传”,同时覆盖/注入关键策略参数。
  • 已经是第一篇啦!

    下一篇: 服务器路由命令有哪些常用技巧?