2011-11-29 26 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', {}) 
相关问题