如何在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
相关产品推荐
相关产品推荐

