Pull to refresh

Как в python снаружи проверить значения, переданные в функцию

Reading time2 min
Views5.5K
Небольшое HowTo для начинающих python-программистов о том как извне проверить некоторые переданные в функцию значения. На самом деле мне это понадобилось в Django, но ничего специфичного для фреймворка в этом нет и…

UPD Лирическое отступление: Изначально тут я написал много глупостей в силу своего кривого понимания работы декораторов. Теперь решение гораздо более правильное и прямое. Более того я даже внятно могу его объяснить, за что огромная благодарность комментаторам.

Для начала рекомендую ознакомиться с работой декораторов (очень тщательно!).

Проблема у меня возникла буквально следующая:

Есть некоторая функция вида для Django перед выполнением которой нужно проверить есть ли некоторые переменные в профиле юзера.

Конкретное решение такое:

def check_nickname(funct):

    def wrapper(request, *args, **kwargs):

        if request.user.profile.nickname:
            return funct(request, *args, **kwargs)
        else:
            from django.shortcuts import render_to_response
            from django.template import RequestContext
            return render_to_response('need_profile.html', RequestContext(request))

    return wrapper

Функция check_nickname является декоратором к функции вида Django, про которую точно известно, что в неё передаётся параметр request определённого типа. Декорируемая функция передаётся во wrapper который и возвращается вместо декорируемой функции.

Принцип работы декоратора:

@f1
def func(x): pass

#эквивалентно этому:

def func(x): pass
func = f1(func)


Т.е. фактически вместо оригинальной функции вызывается функция wrapper возвращаемая декоратором check_nickname. И именно wrapper получает все параметры предназначенные для оригинальной функции вида, и на их основании уже строится логика следующих действий.

Ещё раз спасибо Deepwalker за разъяснения.
Tags:
Hubs:
-3
Comments16

Articles

Change theme settings