** wargs的目的和用途是什么?

**kwargs在Python中有什么用? 函数

我知道您能够在表上执行一个objects.filter并传递**kwargs参数。 spa

我也能够指定时间增量, timedelta(hours = time1)吗? code

它是如何工做的? 它被归类为“拆包”吗? 像a,b=1,2教程


#1楼

kwargs只是添加到参数的字典。 接口

字典能够包含键,值对。 那就是怪兽。 好的,这就是方法。 get

目的不是那么简单。 it

例如(很是假设),您有一个仅调用其余例程来完成工做的接口: io

def myDo(what, where, why):
   if what == 'swim':
      doSwim(where, why)
   elif what == 'walk':
      doWalk(where, why)
   ...

如今,您将得到一个新方法“ drive”: ast

elif what == 'drive':
   doDrive(where, why, vehicle)

可是请稍等,这里有一个新的参数“ vehicle”-您之前不知道。 如今,您必须将其添加到myDo函数的签名中。 function

在这里,您能够使用kwargs-您只需在签名中添加kwargs:

def myDo(what, where, why, **kwargs):
   if what == 'drive':
      doDrive(where, why, **kwargs)
   elif what == 'swim':
      doSwim(where, why, **kwargs)

这样,您没必要在每次调用的某些例程可能更改时都更改接口函数的签名。

这只是一个很好的例子,您可能会发现kwargs有帮助。


#2楼

您能够使用**kwargs来让函数接受任意数量的关键字参数(“ kwargs”表示“关键字参数”):

>>> def print_keyword_args(**kwargs):
...     # kwargs is a dict of the keyword args passed to the function
...     for key, value in kwargs.iteritems():
...         print "%s = %s" % (key, value)
... 
>>> print_keyword_args(first_name="John", last_name="Doe")
first_name = John
last_name = Doe

您也能够在调用函数时使用**kwargs语法,方法是构造关键字参数字典并将其传递给函数:

>>> kwargs = {'first_name': 'Bobby', 'last_name': 'Smith'}
>>> print_keyword_args(**kwargs)
first_name = Bobby
last_name = Smith

Python教程很好地解释了它的工做方式,并提供了一些不错的示例。

<-更新->

对于使用Python 3的人,请使用items()代替iteritems()


#3楼

开箱字典

**打开字典包装。

这个

func(a=1, b=2, c=3)

是相同的

args = {'a': 1, 'b': 2, 'c':3}
func(**args)

若是必须构造参数,这将很是有用:

args = {'name': person.name}
if hasattr(person, "address"):
    args["address"] = person.address
func(**args)  # either expanded to func(name=person.name) or
              #                    func(name=person.name, address=person.address)

函数的打包参数

def setstyle(**styles):
    for key, value in styles.iteritems():      # styles is a regular dictionary
        setattr(someobject, key, value)

这使您能够使用以下功能:

setstyle(color="red", bold=False)

#4楼

kwargs是一种语法糖,用于将名称参数做为字典(对于func)传递,或将字典做为命名参数(对func传递)


#5楼

图案: *args**kwargs用做须要传递给函数调用的参数的占位符

使用*args**kwargs调用函数

def args_kwargs_test(arg1, arg2, arg3):
    print "arg1:", arg1
    print "arg2:", arg2
    print "arg3:", arg3

如今,咱们将使用*args来调用上面定义的函数

#args can either be a "list" or "tuple"
>>> args = ("two", 3, 5)  
>>> args_kwargs_test(*args)

结果:

arg1:两个
arg2:3
arg3:5


如今,使用**kwargs调用相同的函数

#keyword argument "kwargs" has to be a dictionary
>>> kwargs = {"arg3":3, "arg2":'two', "arg1":5}
>>> args_kwargs_test(**kwargs)

结果:

arg1:5
arg2:两个
arg3:3

底线: *args没有智能,它只是将传递的args插值到参数(按从左到右的顺序),而**kwargs经过将适当的值放在所需的位置@来智能地表现

相关文章
相关标签/搜索