eurekafag 23.05.2011 12:25 WOK

Шпаргалка по декораторам.

Без параметров:

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

Recommended by: @rnd_d
1. SirAnthony 23.05.2011 12:45 home

Looks like IndentationError: expected an indented block

2. eurekafagSirAnthony /1 23.05.2011 12:50 WOK

На вебморде выглядит как говно, что поделать. Я тоже мог сбиться, случайно в одном месте удалил строку. Но суть ясна.

3. SirAnthonyeurekafag /2 23.05.2011 13:00 home

В жаббере тоже вся индентация дальше 2 пропала.

5. SirAnthonyeurekafag /4 23.05.2011 14:12 home

Вывалится с кейэррором. args[0].POST.get(var)

6. SirAnthonySirAnthony /5 23.05.2011 14:13 home

Я через зад прочитал, но ладно.

7. eurekafagSirAnthony /6 23.05.2011 14:42 WOK

Уж поверь, работает вполне на тестовом сервере и не вываливается. Проверено.

8. SirAnthonyeurekafag /7 23.05.2011 15:12 home

Работает, да. Я через зад прочитал. Но лишний цикл же.

9. eurekafagSirAnthony /8 23.05.2011 15:26 WOK

В каком это виде лишний? Я проверяю наличие элемента массива, а потом его заполненность.

10. werehuman 23.05.2011 16:00

Извини, раз уж пошло дело по научному, то называй их грамотно
"С параметрами" — это фабрика декораторов.
А ещё если ты напишешь repr(ololo) от своей декорированной ololo, то получишь <function "wrapper" at ...>, посему не забывай перед return wrapper писать wrapper.func_name = func.func_name

11. eurekafagwerehuman /10 23.05.2011 16:17 WOK

В научные тонкости не вникал, быдлокодю же. Просто заебался делать проверки в каждой функции на заполненность переменных, ну и решил это декоратором. Можно было по-разному, но мне этот способ понравился как самый лаконичный и гибкий. А repr'ы всякие не использую.

12. werehumaneurekafag /11 23.05.2011 16:18 Psi+

> А repr'ы всякие не использую.
Ну это пока

13. SirAnthonyeurekafag /11 23.05.2011 16:24 home

Можно делать через try: except KeyError Зависимость огромна

14. werehumanSirAnthony /13 23.05.2011 16:25 Psi+

юзай декораторы там, где они уместны. Юзай исключения там, где они уместны

15. eurekafagSirAnthony /13 23.05.2011 16:26 WOK

Сложновато в джанге такое провернуть, ведь мои функции вызываются напрямую движком. Глобально исключения ловить тупо негде, а писать в каждой функции... ну ты понял, сколько это левого говна. Декоратор же занимает ровно одну строчку перед именем функции.

16. SirAnthonyeurekafag /15 23.05.2011 16:28 home

Я слабо представляю, что и как у тебя вызывается движком. Ты свои сигналы и мидлвари пишешь штоле?

17. eurekafagSirAnthony /16 23.05.2011 16:29 WOK

Я пишу обычные views, движок — вся остальная джанга.

18. SirAnthonyeurekafag /17 23.05.2011 16:32 home

Во вьюшках, декораторы уместнее, наверное, да. Только опять же, в чем смысл проверки на пустые значения для меня остается загадкой, их все равно нужно заполнять дефолтами какими-нибудь. Вообще, интересная идея все попихать в декораторы, нужно будет сделать себе.

19. eurekafagSirAnthony /18 23.05.2011 16:33 WOK

Нет, просто если значение не заполнено, выводится HTTP 400 Fail. Примитивная защитка от ошибок яваскрипта и какеров.

20. SirAnthonyeurekafag /19 23.05.2011 16:34 home

Сделай обязательным, джанга будет ругаться с 500

21. eurekafagSirAnthony /20 23.05.2011 16:34 WOK

Я не хочу 500, я хочу СПАРТУ!!!

Do you really want to delete ?