的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')
一般来说,我们可以做些什么组合?
感谢,并为我愚蠢的问题
的总体思路是惋惜:
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):
...
这将允许与name
和lname
作为关键字只调用。
请注意,这是一个不寻常的界面,可能会让用户恼火 - 我只会在非常特殊的用例中使用它。
在2.x中,您需要手动解析**kwargs
。
它至少可以用于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
相关:http://stackoverflow.com/questions/9872824/calling -a-python-function-with-args-kwargs-and-optional-default-arguments – mgilson 2013-02-25 19:35:00