python 2.7,具有位置,关键字参数以及可变数量的参数(任意参数列表)的函数

时间:2016-07-26 16:41:24

标签: python-2.7

有没有办法实现一个具有可变数量的参数(* args)和非可选关键字参数的函数?我想实现这样的事情:

def foo(positional arguments, keyword arguments,*args):

     {
      ...
     }

但是,现在似乎无法正确调用此功能。设arg1和arg2是我们想要在函数调用中传递的类型(* arg)的参数。

foo(posargs, kwarg=value, arg1, arg2) 
不允许

(kwargs必须最后),而:

foo(posargs,arg1,arg2,kwarg=value)

会导致错误的函数调用,因为arg1在位置上被分配给kwarg,尽管kwa​​rg在函数调用中被提供了一个关键字值。

是否有任何替代的定义或调用语法可以避免这种情况,(除了在函数调用中使用kwarg值作为位置参数调用的简单解决方案之外)?

2 个答案:

答案 0 :(得分:2)

这是在PEP 3102中引入的Python 3功能。 (Python, default keyword arguments after variable length positional arguments

在Python 2中,您必须从**kwargs中提取关键字参数:

def foo(positional arguments, *args, **kwargs):
    # for a required positional argument
    try:
        kwarg = kwargs.pop('kwarg')
    except KeyError as e:
        raise TypeError('Required positional argument not found', e)

    # or for an optional positional argument
    kwarg = kwargs.pop('kwarg', None)

    if kwargs:
        raise TypeError('Unexpected positional arguments', kwargs)

答案 1 :(得分:0)

* args会将无法比较的位置参数收集到元组中。 ** kwargs用于收集无法匹配的关键字参数,并将它们放入元组而不是字典中。

来自O' Reilly的学习Python第535页:

def f(a, *pargs, **kargs):
    print (a, pargs, kargs)

f(1,2,3,x=1, y=2)
1 (2, 3), {'y':2, 'x':1}

从同一本书的第531页开始:"在电话和标题中,** args表格必须出现在最后。如果以任何其他顺序混合参数,则会出现语法错误,因为组合可能不明确。"