python - 使用 *args、**kwargs 和可选/默认参数调用 Python 函数

标签 python python-3.x keyword-argument

在 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)
    ...

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

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

可以称为

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

所以这会在 3 是否应该打包到 argskwargs 方面引入一些歧义。但是,使用 Python 3,可以指定仅关键字参数:

def func(a,b,*,kw=None):  # can be called as 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 字典来模拟这种行为函数。

最佳答案

可以在 Python 3 中做到这一点。

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

仅当您想指定仅关键字参数而不使用 *args 接受可变数量的位置参数时,才使用裸露的 *。您不使用两个 *

引用语法,在 Python 2 ,你有

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

Python 3 中时,你有

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

其中包括在 * 参数之后的附加参数的规定。

更新:

最新的 Python 3 文档 here .

关于python - 使用 *args、**kwargs 和可选/默认参数调用 Python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9872824/

相关文章:

python - 将一本书解析成章节——Python

python-3.x - 为什么 print ('a' > 'b' ) False 而 print ('a' > 'A' ) True?

python-3.x - python3请求使用quote而不是quote_plus

python - 从带有和不带有 **kwargs 的类继承

python - 将函数应用于数据帧以创建列表的矢量化方式

python - 按长度和值对列表列表进行排序

linux - 我怎样才能让 pyinstaller 在 Ubuntu 上工作?

python - 如何在 Python 2 中将位置参数视为关键字参数

Python:从 ttk.Frame 继承时不能使用关键字参数

python - 如何使用 pyenv、virtualenv 和 pipenv?