Python 函数参数的值既不是调用者传入的,也不是默认值
我有一个这样的装饰师:Python 函数参数的值既不是调用者传入的,也不是默认值,python,django,Python,Django,我有一个这样的装饰师: 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
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(上下文)参数有时包含属于最后一个HTTP请求的数据。然后我把范围缩小到这个装饰器,发现ctx在它应该在{}这里的时候有价值
所以我设置了一个断点,再往上一层,然后我发现它的调用者根本没有传递任何东西给它
一个参数的值怎么可能既不是调用者传入的,也不是默认值?您正在使用一个可变参数作为默认参数。每次在没有该参数的情况下调用它时,它将包括您提供的参数,包括先前的修改。改用
None
作为默认值,检查它,如果为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
您正在使用可变参数作为默认参数。每次在没有该参数的情况下调用它时,它将包括您提供的参数,包括先前的修改。改用
None
作为默认值,检查它,如果为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
ctx可能会被分配到包装函数的第一个参数。关键字arg后面不能跟*args。就调用方而言,ctx只是另一个参数 例如:
my_func(request, 1, 2, 3)
将导致ctx被分配1。ctx需要被视为kwargs的一部分
ctx = kwargs.get('ctx', {})
ctx可能会被分配到包装函数的第一个参数。关键字arg后面不能跟*args。就调用方而言,ctx只是另一个参数 例如:
my_func(request, 1, 2, 3)
将导致ctx被分配1。ctx需要被视为kwargs的一部分
ctx = kwargs.get('ctx', {})
哇,我已经使用Python很多年了,但是仍然有一些东西需要学习。哇,我已经使用Python很多年了,但是仍然有一些东西需要学习。