的Python:按名称与kwargs

问题描述:

在蟒蛇一起传递参数,我们可以这样做:的Python:按名称与kwargs

def myFun1(one = '1', two = '2'): 
    ... 

然后我们可以调用函数,并通过他们的名字传递参数:

myFun1(two = 'two', one = 'one')

而且我们可以这样做:

def myFun2(**kwargs): 
    print kwargs.get('one', 'nothing here') 

myFun2(one='one')

所以我想知道是否有可能以两种方法结合起来,如:

def myFun3(name, lname, **other_info): 
    ... 

myFun3(lname='Someone', name='myName', city='cityName', otherInfo='blah')

一般来说,我们可以做些什么组合?

感谢,并为我愚蠢的问题

+1

相关:http://stackoverflow.com/questions/9872824/calling -a-python-function-with-args-kwargs-and-optional-default-arguments – mgilson 2013-02-25 19:35:00

的总体思路是惋惜:

def func(arg1, arg2, ..., kwarg1=default, kwarg2=default, ..., *args, **kwargs): 
    ... 

,只要你想你可以使用尽可能多的那些。 ***将“吸收”任何其他未考虑的值。

位置参数(未提供默认值)不能由关键字给出,而非默认参数不能跟随默认参数。

注Python 3中还增加了通过使它们*后指定关键字只有参数的能力:这意味着没有任何参数被捕获后

def func(arg1, arg2, *args, kwonlyarg=default): 
    ... 

您也可以单独使用*def func(a1, a2, *, kw=d):),但任何仅为关键字。

所以,如果你是在3.x中,你可以制作你想要的行为:

def myFun3(*, name, lname, **other_info): 
    ... 

这将允许与namelname作为关键字只调用。

请注意,这是一个不寻常的界面,可能会让用户恼火 - 我只会在非常特殊的用例中使用它。

在2.x中,您需要手动解析**kwargs

+0

小心我不认为你可以在* args之后有默认参数(至少不是在python2.x中) – mgilson 2013-02-25 19:29:15

+0

@mgilson I总是忘记2.x的缺点,修正了在python中使用 – 2013-02-25 19:33:22

+0

2.7'def test(var,kwarg1 = 1,* args,** kwargs):...'对我不起作用。一个关键字参数 – Raufio 2013-02-25 19:39:04

它至少可以用于Python 2.7。关键字参数会被分配给按名称位置参数,所以你可以做

In [34]: def func(name, lname, **kwargs): 
    print 'name='+name, 'lname='+lname 
    print kwargs 
    ....:  

In [35]: func(lname='lname_val', name='name_val', city='cityName', otherInfo='blah') 
name=name_val lname=lname_val 
{'city': 'cityName', 'otherInfo': 'blah'} 

官方的文档说明这种方式: “如果关键字参数都存在,他们是先转化为位置参数,如下首先,将为形式参数创建未填充插槽列表。如果有N个位置参数,则将它们放置在前N个插槽中。接下来,对于每个关键字参数,使用标识符来确定对应的插槽(如果标识符与第一个形式参数名称相同,则使用第一个插槽,等等)。如果该插槽已被填充,则会引发TypeError异常。否则,参数的值被放置在插槽中,填充它(即使表达式是None,它将填充插槽)。“ https://docs.python.org/2/reference/expressions.html#calls