37

在python中我们可以这样做:

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

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

感谢并为我的愚蠢问题感到抱歉。

4

3 回答 3

40

总体思路是:

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.

于 2013-02-25T19:27:35.700 回答
1

至少对于 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个槽。接下来,对于每个关键字参数,使用标识符来确定对应的槽(如果标识符与第一个形参名称相同,则使用第一个槽,依此类推)。如果槽是“ https://docs.python.org/2/reference/expressions.html#calls

于 2018-02-14T09:59:31.467 回答
1

您可以将命名参数与 kwargs 一起添加。如果调用函数中的键可用,它将被带到您的命名参数,否则它将被 kwargs 字典采用。

def add(a=1, b=2,**c):
    res = a+b
    for items in c:
        res = res + c[items]
    print(res)
add(2,3)

5

add(b=4, a =3)

7

add(a =1,b=2,c=3,d=4)

10

于 2020-02-25T16:40:26.367 回答