** 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經過將適當的值放在所需的位置@來智能地表現

相關文章
相關標籤/搜索