Python的:按名称与kwargs一起传递参数(Python: Passing parameter

2019-07-20 12:07发布

在蟒蛇,我们可以这样做:

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')

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

谢谢你为我愚蠢的问题抱歉。

Answer 1:

总体思路是:

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



Answer 2:

这是可能的,至少为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



文章来源: Python: Passing parameters by name along with kwargs