You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python函数签名中同时使用/、*、*args和**kwargs?

Python函数签名:同时使用仅位置参数、*args、仅关键字参数与**kwargs的可行写法

问题描述

用户尝试编写包含多种参数类型的Python函数,现有代码如下:

def fun(a, /, b, *, c=None, **kwargs):
    print(f"{a = }, {b = }, {c = }")

其中a为仅位置参数,b支持位置或关键字传参,c为仅关键字参数,同时支持额外关键字参数。但添加*args收集额外位置参数时始终触发语法错误,疑问是否无法同时使用/、*、*args和**kwargs,或是存在遗漏的可行写法。

可行写法说明

完全可以同时组合这些参数类型,关键得遵守Python的参数语法顺序:/(仅位置参数分隔符)必须放在最前面,接着是普通的位置/关键字参数,然后是*args(收集额外位置参数),再用*划开仅关键字参数的区域,之后放仅关键字参数,最后是**kwargs(收集额外关键字参数)。

正确的函数签名示例:

def fun(a, /, b, *args, c=None, **kwargs):
    print(f"{a = }, {b = }, {c = }, args = {args}, kwargs = {kwargs}")

参数规则拆解

  • a, /:a是仅位置参数,只能按位置传值,不能写a=xxx这种关键字形式
  • b:属于位置/关键字通用参数,两种传参方式都能用
  • *args:把b之后多出来的位置参数全收进元组里
  • *:这是个分隔标记,后面的参数必须用关键字形式传值,比如c就得写c=xxx
  • **kwargs:把没定义过的关键字参数全收进字典里

测试调用看看效果:

# 合法调用示例
fun(1, 2, 3, 4, c=5, d=6, e=7)
# 输出结果:a = 1, b = 2, c = 5, args = (3, 4), kwargs = {'d': 6, 'e': 7}

# 注意:仅位置参数a不能用关键字传参,下面这种写法会报错
# fun(a=1, 2, c=3)  # 触发SyntaxError

补充说明

2023年8月14日发布的文章《Python星号与斜杠特殊参数有何用途?》(原标题:What Are Python Asterisk and Slash Special Parameters For?)详细讲解了这类特殊参数的设计意图与使用场景。

内容的提问来源于stack exchange,提问作者khaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:10:36