在Python中,我可以定义如下函数:

def func(kw1=None,kw2=None,**kwargs):
   ...

在这种情况下,我可以称func为:

func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)

我还可以将函数定义为:

def func(arg1,arg2,*args):
    ...

这可以称为

func(3,4,additional,arguments,go,here,Ellipsis)

最后,我可以将这两种形式结合起来

def func(arg1,arg2,*args,**kwargs):
    ...

但是,不起作用的是:

func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs):  #SYNTAX ERROR (in Python 2 only, apparently this works in Python 3)
    ...

我最初的 idea 是,这可能是因为一个函数

def func(arg1,arg2,*args,kw1=None):
    ...

可称为

func(1,2,3)  #kw1 will be assigned 3

因此,这将引入一些模糊性,即3应该被打包成args还是kwargs.但是,在Python 3中,可以指定仅限关键字的参数:

def func(a,b,*,kw=None):  # 可称为 func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
    ...

这样看来,在以下方面似乎没有语法歧义:

def func(a,b,*args,*,kw1=None,**kwargs):
    ...

然而,这仍然会带来一个语法错误(用Python3.2测试).有什么我不知道的原因吗?还有,有没有一种方法可以获得我上面描述的行为(有*args个默认参数)——我知道我可以通过操纵函数中的kwargs字典来模拟这种行为.

推荐答案

在Python3中可以做到这一点.

def func(a,b,*args,kw1=None,**kwargs):

bare *仅在您希望指定仅关键字参数without时使用,该参数接受数量可变的带*args的位置参数.你不用两个*.

引用语法,在Python 2中,你有

parameter_list ::=  (defparameter ",")*
                    (  "*" identifier [, "**" identifier]
                    | "**" identifier
                    | defparameter [","] )

而在Python 3岁时,你有

parameter_list ::=  (defparameter ",")*
                    (  "*" [parameter] ("," defparameter)*
                    [, "**" parameter]
                    | "**" parameter
                    | defparameter [","] )

其中包括在*参数之后提供额外参数.

UPDATE:

最新的Python3文档here.

Python-3.x相关问答推荐

在numpy. linalg的qr之后使用scipy. integrate中的solve_ivp时出现了一个奇怪的错误

我想判断df_entry_log[AM_PM],并根据测试填充列

在BaseHTTPRequestHandler中填充和返回列表

Sunburst 折线图可视化

按字母顺序排序列表 (OrderFilter),条件是值为 '' 的条目位于列表 DRF 的末尾

在 groupby 之后,Pandas 在特定类别中获得最常见和最后的值

为什么 Sympy 不能解决我的非线性系统? Python 解释器一直在执行,直到我终止进程

Python.在循环中填充字典的问题

通过最接近的匹配合并两个不同长度的列上的两个数据框

为什么 Python 枚举中的可变值是同一个对象?

为什么等效的 Python 代码要慢得多

Python中调用者函数的访问变量

如何将 Matplotlib 图形转换为 PIL Image 对象(不保存图像)

从大字典中弹出 N 项的最快方法

将行附加到 DataFrame 的最快和最有效的方法是什么?

根据条件过滤元组列表

如何使用 Python 订阅 Websocket API 通道?

导入父目录进行简要测试

对字节进行按位运算

如何对字典的函数输出列表进行单元测试?