2016-09-29 73 views
3

我正在閱讀有關模板視圖通過教程和一些代碼類型的困惑我。筆者使用此代碼示例模板視圖 - kwargs和** kwargs

from django.utils.timezone import now 

class AboutUsView(TemplateView): 
    template_name = 'about_us.html' 

def get_context_data(self, **kwargs): 
    context = super(AboutUsView, self).get_context_data(**kwargs) 
    if now().weekday() < 5 and 8 < now().hour < 18: 
     context['open'] = True 
    else: 
     context['open'] = False 
    return context 

是困惑我語法是這樣的說法

context = super(AboutUsView, self).get_context_data(**kwargs) 

如果我們已經收到**kwargs那麼爲什麼我們把它傳遞給超級功能與**的事情(雙開始)。我想我們應該通過它作爲

context = super(AboutUsView, self).get_context_data(kwargs) 

這是接收此調用的contextMixin。

class ContextMixin(object): 
    """ 
    A default context mixin that passes the keyword arguments received by 
    get_context_data as the template context. 
    """ 

    def get_context_data(self, **kwargs): 
     if 'view' not in kwargs: 
      kwargs['view'] = self 
     return kwargs 

從我讀的是使用**kwargs幾乎意味着kwargs是當前一本字典,需要轉換爲命名值。如果這是正確的,那麼當參數實際上是** kwargs時,kwargs如何成爲字典。我希望我的問題有道理。請讓我知道你是否想要我重述這個。

回答

3

在函數聲明中,**kwargs將採用所有未指定的關鍵字參數並將它們轉換爲字典。

>>> test_dict = {'a':1, 'b':2} 
>>> def test(**kwargs): 
...  print (kwargs) 
... 
>>> test(**test_dict) 
{'b': 2, 'a': 1} 

注意,字典對象必須使用**當它被傳遞給函數(test(**test_dict))和被轉換時,它是由函數接收。這是不可能做到以下幾點:

>>> test(test_dict) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: test() takes 0 positional arguments but 1 was given 

所以,在你的榜樣,第一**kwargs拆包關鍵字參數到一個字典,然後第二打包它們備份發送到父。

簽名中帶有**kwargs的函數可以接收未解壓縮的字典或未指定的關鍵字參數。下面是第二種情況的示例:

>>> def test(arg1, **kwargs): 
...  print (kwargs) 
... 
>>> test('first', a=1, b=2) 
{'b': 2, 'a': 1} 
+0

好吧,這絕對有道理。感謝您清除 –

+0

順便說一句,你怎麼知道'def get_context_data(self,** kwargs):'實際上是接收字典中的kwargs? –

+0

@JamesFranco看到我的編輯:大部分時間這是爲了接收未指定的關鍵字參數。 – brianpck

2

在您的函數定義中,它接受多個參數,並將它們解析爲字典。 def get_context_data(self, **kwargs):

所以現在,kwargs是一個字典對象。所以如果你把它傳遞給.get_context_data(kwargs)它將不得不期待只有一個傳入的參數,並把它當作字典。

因此,當您再次執行**kwargs時,您將字典炸回到關鍵字參數中,這些關鍵字參數將擴展到該函數調用中。

+0

所以你是說你可以使用**將多個參數轉換成字典?我認爲我們只能使用**從字典轉換爲多個參數。 –

+0

它被保留用於函數和lamdas,用於將關鍵字參數轉換爲字典,所以很可惜。但是你可以用python3中的*參數來包裝東西。 http://peter-hoffmann.com/stackoverflow/36908.html – CasualDemon