首页 > 解决方案 > 为什么 Python 在关键字参数之后允许 *args?

问题描述

例子:

def foo(a, b=2, *args, **kwargs): pass

为什么这不会导致 SyntaxError?*args 不会捕获额外的非关键字参数,因为在关键字参数之后传递它们是非法的。

对于 python3.x,*args 的正确使用,在这种情况下 **kwargs 看起来像:

def foo(a, *args, b=2, **kwargs): pass

感谢您对这种奇怪行为的任何见解。

编辑:

感谢 Jab 将我指向 PEP 3102,它简明地解释了这种行为。一探究竟!

还要感谢 jsbueno 的额外出色解释,由于它的彻底性,我将其更新为最佳答案。

标签: pythonpython-3.x

解决方案


由于多种原因,这被实施到 3.X 中。我能回答这个问题的最佳方法是参考
PEP 3102

另请查看 Python 3.0.1 文档中的新语法部分。

TLDR:

在参数列表中出现在 *args 之后的命名参数必须在调用中使用关键字语法指定。您还可以在参数列表中使用裸 * 来表示您不接受可变长度参数列表,但您确实有仅关键字参数。


推荐阅读