Аргумент функции, имеющий значение, которое не передается ни вызывающим, ни значением по умолчанию - PullRequest
1 голос
/ 30 ноября 2011

У меня есть такой декоратор:

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 имеет значение, когда он должен быть {} здесь.

Итак, я установил точку останова и поднялся на один уровень, а потом обнаружил, что вызывающая сторона НЕ передает ему вообще ничего.

Как аргумент может иметь значение, которое не передается ни вызывающим, ни значением по умолчанию?

Ответы [ 2 ]

5 голосов
/ 30 ноября 2011

Вы используете изменяемый аргумент в качестве параметра по умолчанию. Каждый раз, когда он вызывается без этого аргумента, он будет включать тот, который вы указали, включая предыдущие модификации. Вместо этого используйте None в качестве значения по умолчанию, проверьте его, и, если оно is None, присвойте пустой текст в теле функции.

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 голосов
/ 30 ноября 2011

ctx, вероятно, получает первый аргумент обернутой функции.Вы не можете иметь ключевое слово arg, за которым следует * args.Что касается вызывающей стороны, ctx - это просто еще один аргумент.

Например:

my_func(request, 1, 2, 3)

приведет к тому, что ctx будет назначен 1. ctx необходимо считать частью kwargs.

ctx = kwargs.get('ctx', {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...