Можно ли в функции использовать переменные из декоратора в Python?

Имеем декоратор, вида:
def base_context(fun):
    def decorate_maker(request, slug,  var):
        context = {}
        context['info'] = slug
        return fun(request,  var)
    return decorate_maker

Сама функция имеет вид:
def fun(request, var):
    context['data'] = var
    return context


Если обернуть функцию декоратором, Python ругается на неизвестную глобальную переменную 'context'.
Можно ли каким-то образом использовать переменные, описанные в decorate_maker?
  • Вопрос задан
  • 691 просмотр
Пригласить эксперта
Ответы на вопрос 3
@FireGM
Не самый лучший вариант, использовать то, что у неё нет. При помощи декоратора можно изменить входные или выходные данные этой функции. А если в функции нужно использовать что-то из декоратора, то и передавайте ей явно всё, что может потребоваться.
Явное лучше неявного.
Ответ написан
Комментировать
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Только если передавать из декоратора саму переменную в функцию, добавив ей аргумент context.
Ответ написан
Комментировать
Ermako
@Ermako
Data Scientist
Можно использовать пространство имен самой передаваемой функции
def base_context(fun):
    def decorate_maker(nums,*args):
        fun.func_globals['nums'] = nums
        return fun(*args)
    return decorate_maker

@base_context
def fun(pow):
    return [(k,v**pow) for k,v in nums.iteritems()]

nums = {'one':1,'two':2,'four':4}
>>>>fun(nums,2)
[('four', 16), ('two', 4), ('one', 1)]

>>>>fun(nums,3)
[('four', 64), ('two', 8), ('one', 1)]


У Вас это будет вот так, по всей видимости
def base_context(fun):
    def decorate_maker(request, slug,  var):
        context = {}
        context['info'] = slug
        fun.func_globals['context']=context
        return fun(request,  var)
    return decorate_maker
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы