2011-11-29 70 views
1

傳遞函數參數具有值I有一個這樣的裝飾:既不是由呼叫者也不默認值

def region_required(view_func): 
    def new_view(request, ctx = {}, *args, **kw): 
     import pdb; pdb.set_trace() 
     ctx['regions'] = Region.objects.all() 
     return view_func(request, context=ctx, *args, **kw) 
    return new_view 

我使用它來裝飾視圖的功能。

今天我注意到一些非常奇怪的事情,ctx(context)參數有時候會有屬於上一個HTTP請求的數據。然後我把它縮小到這個裝飾器,發現ctx在這裏應該是有價值的。

所以我設置了一個斷點,然後去了一級,然後我發現它的調用者根本不會傳遞任何東西。

參數如何具有既不被調用者傳遞也不默認值的值?

回答

5

您正在使用可變參數作爲默認參數。每次在沒有這個參數的情況下調用它時,它都會包含您提供的內容,包括之前的修改。改用None作爲默認值,檢查它,如果是is None,則在函數主體中分配空dict。

def region_required(view_func): 
    def new_view(request, ctx=None, *args, **kw): 
     if ctx is None: 
      ctx = {} 
     import pdb; pdb.set_trace() 
     ctx['regions'] = Region.objects.all() 
     return view_func(request, context=ctx, *args, **kw) 
    return new_view 
+0

哇,我一直在使用Python多年,但仍然有東西需要學習。 – ablmf

0

ctx很可能會被分配到被包裝函數的第一個參數arg。你不能有一個關鍵字arg,然後是* args。就調用者而言,ctx只是另一個參數。

例如:

my_func(request, 1, 2, 3) 

將導致CTX被分配1. CTX需要考慮kwargs的一部分。

ctx = kwargs.get('ctx', {}) 
相關問題