在蟒蛇,我们可以这样做:
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异常。否则,该参数的值被放置在狭槽,填充它(即使该表达式是无,它填补了时隙)“。 https://docs.python.org/2/reference/expressions.html#calls