Python:通过名称和 kwargs 传递参数

Posted

技术标签:

【中文标题】Python:通过名称和 kwargs 传递参数【英文标题】:Python: Passing parameters by name along with kwargs 【发布时间】:2013-02-11 01:26:35 【问题描述】:

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

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

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

【问题讨论】:

相关:***.com/questions/9872824/… 【参考方案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

【讨论】:

【参考方案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 异常引发。否则,参数的值被放置在槽中,填充它(即使表达式为 None,它也会填充槽)。 https://docs.python.org/2/reference/expressions.html#calls

【讨论】:

【参考方案3】:

大体思路是:

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 手动完成此操作。

【讨论】:

小心。我认为您不能在 *args 之后使用默认参数(至少在 python2.x 上不能)。 @mgilson 我总是忘记 2.x 的缺点,已修复。 在 python 2.7 def test(var, kwarg1=1, *args, **kwargs): ... 中对我不起作用。抱怨关键字参数有多个值。 @Raufio 问题可能是你在调用它,在位置和关键字上填充kwarg1 - 这显然为同一个变量提供了两个值。例如:test(1, 2, kwarg1=3)kwarg1 应该是 2 还是 3?要么做test(1, 2)要么test(1, kwarg1=3) @Raufio test(1, 10, 1, 2, 3, test=15)

以上是关于Python:通过名称和 kwargs 传递参数的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4 将转换矩阵作为参数传递给构造函数

python 函数动态参数,名称空间,global,nonlocal

python3进阶之*args与**kwargs用法

动态传参(*args **kwargs 无敌传参) 作用域globals locals和名称空间 函数的嵌套 关键字nonlcas global

Python:如何将参数传递给线程作业(回调)

函数名传递与名称空间