Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数参数的值既不是调用者传入的,也不是默认值_Python_Django - Fatal编程技术网

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很多年了,但是仍然有一些东西需要学习。