В какой момент выполняется декорируемая функция?

Подскажите в какой момент выполняется декорируемая функция. Есть код:
def base(func):
    def wrapped(*args, **kwargs):
        context_dict
        context_dict = {'categories_menu': Category.objects.filter(menu=True)}
        return func(*args, **kwargs)
    return wrapped

@base
def index(request): 
    page_list_new = Page.objects.order_by('-datetime')[:5]
    context_dict['pages_new'] = page_list_new
    return render(request, 'home/index.html', context_dict)

Предполагал, словарь будет создан непосредственно перед вызовом функции, но видимо это не так. Как можно заставить код работать (кроме глобальной переменной)?
  • Вопрос задан
  • 299 просмотров
Решения вопроса 1
crazyzubr
@crazyzubr
Python backend-developer
Словарь создается перед вызовом функции, однако он никуда не передается и внутри функции о нем ничего неизвестно. В этом коде для функции index будет ошибка, так как словарь не инициализирован. Попробуйте так:

def base_context(func):
    def wrapped(*args, **kwargs):
        context_dict = {'categories_menu': Category.objects.filter(menu=True)}
        kwargs['context_dict'] = context_dict
        return func(*args, **kwargs)
    return wrapped

@base_context
def index(request, **kwargs): 
    page_list_new = Page.objects.order_by('-datetime')[:5]
    context_dict = kwargs.get('context_dict', {})
    context_dict['pages_new'] = page_list_new
    return render(request, 'home/index.html', context_dict)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@EvgeniyKonstantinov
Давненько я не брал в руки Python, но попробую

Сначала выполняется base
Потом index

Проблема не в порядке, а в том, что context_dict есть только в области видимости функции base

Соответственно вы можете передать в index словарь context_dict добавив его к аргументам функции при ее вызове в декораторе:

kwargs['context_dict'] = context_dict

В итоге ваш год должен выглядеть как - то так:

def base(func):
    def wrapped(*args, **kwargs):
        context_dict = {'categories_menu': Category.objects.filter(menu=True)}
        kwargs['context_dict'] = context_dict
        return func(*args, **kwargs)
    return wrapped

@base
def index(*args, **kwargs): 
    page_list_new = Page.objects.order_by('-datetime')[:5]
    context_dict = kwargs['context_dict']
    context_dict['pages_new'] = page_list_new
    return render(request, 'home/index.html', context_dict)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы