Шпаргалка по декораторам.
Без параметров:
def testdec(func):
def wrapper(*args, **kwargs): # это параметры декорируемой функции
print "Inside the decorator."
return func(*args, **kwargs) # выполнить функцию и вернуть результат
return wrapper
С параметрами:
def check_vars(varlist): # здесь перечисляем параметры декоратора как у обычной функции, можно использовать дефолтные значения
def wrap(func):
def wrapper(*args, **kwargs): # это параметры декорируемой функции
for var in varlist:
if not var in args[0].POST or not args[0].POST[var]: # проверка наличия переменных, просто пример для джанги, где args состоит из одного объекта request
return HttpResponseBadRequest("fail")
return func(*args, **kwargs) # выполнить функцию и вернуть результат
return wrapper
return wrap
eurekafag
23.05.2011 12:25 WOK
Recommended by:
@rnd_d
Do you really want to delete ?
Looks like IndentationError: expected an indented block
На вебморде выглядит как говно, что поделать. Я тоже мог сбиться, случайно в одном месте удалил строку. Но суть ясна.
В жаббере тоже вся индентация дальше 2 пропала.
http://pastebin.com/5GTznFp4 fxd
Вывалится с кейэррором. args[0].POST.get(var)
Я через зад прочитал, но ладно.
Уж поверь, работает вполне на тестовом сервере и не вываливается. Проверено.
Работает, да. Я через зад прочитал. Но лишний цикл же.
В каком это виде лишний? Я проверяю наличие элемента массива, а потом его заполненность.
Извини, раз уж пошло дело по научному, то называй их грамотно
"С параметрами" — это фабрика декораторов.
А ещё если ты напишешь repr(ololo) от своей декорированной ololo, то получишь <function "wrapper" at ...>, посему не забывай перед return wrapper писать wrapper.func_name = func.func_name
В научные тонкости не вникал, быдлокодю же. Просто заебался делать проверки в каждой функции на заполненность переменных, ну и решил это декоратором. Можно было по-разному, но мне этот способ понравился как самый лаконичный и гибкий. А repr'ы всякие не использую.
> А repr'ы всякие не использую.
Ну это пока
Можно делать через try: except KeyError Зависимость огромна
юзай декораторы там, где они уместны. Юзай исключения там, где они уместны
Сложновато в джанге такое провернуть, ведь мои функции вызываются напрямую движком. Глобально исключения ловить тупо негде, а писать в каждой функции... ну ты понял, сколько это левого говна. Декоратор же занимает ровно одну строчку перед именем функции.
Я слабо представляю, что и как у тебя вызывается движком. Ты свои сигналы и мидлвари пишешь штоле?
Я пишу обычные views, движок — вся остальная джанга.
Во вьюшках, декораторы уместнее, наверное, да. Только опять же, в чем смысл проверки на пустые значения для меня остается загадкой, их все равно нужно заполнять дефолтами какими-нибудь. Вообще, интересная идея все попихать в декораторы, нужно будет сделать себе.
Нет, просто если значение не заполнено, выводится HTTP 400 Fail. Примитивная защитка от ошибок яваскрипта и какеров.
Сделай обязательным, джанга будет ругаться с 500
Я не хочу 500, я хочу СПАРТУ!!!