为什么我不能像这样使用星号运算符? def foo(* args,this ="默认",** kwargs)

时间:2014-07-26 01:24:44

标签: python python-2.7 syntax arguments syntax-error

这很有趣:

def foo(*args, this="default", **kwargs):
    pass

  File "foo.py", line 1
    def foo(*args, this="default", **kwargs):
                  ^
SyntaxError: invalid syntax

由于我有一组不可知的位置参数,一组不可知的关键字参数,以及一个或两个已知的关键字参数,我的另一个选择是:

def foo(*args, **kwargs):
    this = kwargs.pop("this", "default")
    ...

所以,因为对于为什么事情是这样的,似乎总是有一个很好的答案,我想知道。为什么不允许这样做?


编辑:
谢谢@dano
Added in Python3

1 个答案:

答案 0 :(得分:2)

您尝试使用this做的是使其成为仅限关键字的参数;没有办法提供位置论证。在Python 3.0中添加了支持此功能。 Here是描述其添加的PEP,以及其他相关增强功能。它的基本原理部分非常清楚地描述了这个问题:

  

当前的Python函数调用范例允许参数     可以按位置或按关键字指定。一个论点可以     通过名称或隐含地按位置填写。

     

通常情况下,功能需要采用     可变数量的参数。 Python语言支持这一点     使用'varargs'语法('* name'),它指定任何语法     '遗留'参数作为a传递给varargs参数     元组。

     

对此的一个限制是,目前,所有的常规     必须在vararg插槽之前填充参数槽。

     

这并不总是令人满意的。人们可以很容易地想到一个功能     它采用可变数量的参数,但也需要一个     或更多关键字参数形式的“选项”。目前,     唯一的方法是定义一个varargs参数,     和'关键字'参数(** kwargs),然后手动提取     字典中所需的关键字。

基本上,这只是varargs原始实现的限制,直到Python 3才解决。