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):
...
这将允许使用 name
和 lname
作为关键字调用。
请注意,这是一个不寻常的界面,可能会让用户感到烦恼 - 我只会在非常特定的用例中使用它。
在 2.x 中,您需要通过解析 **kwargs
手动完成此操作。
【讨论】:
小心。我认为您不能在 *args 之后使用默认参数(至少在 python2.x 上不能)。 @mgilson 我总是忘记 2.x 的缺点,已修复。 在 python 2.7def 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 传递参数的主要内容,如果未能解决你的问题,请参考以下文章
python 函数动态参数,名称空间,global,nonlocal
动态传参(*args **kwargs 无敌传参) 作用域globals locals和名称空间 函数的嵌套 关键字nonlcas global