Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
 Аватар для Zuzik
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557

Использование декораторов

22.02.2017, 16:18. Показов 4613. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задача сделать декоратор, который бы подключался к базе данных, выполнял некоторые действия, передавал соединение к бд и курсор во внутреннюю функцию. После выполнения функции - выполнял еще пару действий.
Написанный код.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def query_in_session(fn):
    def wrapped():
        con = cx_Oracle.connect(settings.HYDRA_CONNECTION_STRING)
 
        try:
            cur = con.cursor()
            try:
                assert isinstance(cur, cx_Oracle.Cursor)
                assert isinstance(con, cx_Oracle.Connection)
 
                cur.callproc(**settings.INIT_SESSION)
                cur.callproc(**settings.SET_ACTIVE_FIRM)
                res = fn(cur, con)
                cur.callproc(**settings.CLOSE_SESSION)
                con.commit()
            except cx_Oracle.Error:
                res = False
            finally:
                cur.close()
        except cx_Oracle.Error:
            res = False
        finally:
            con.close()
 
        return res
 
    return wrapped()
Но есть одна проблема - чтобы были доступны объект соединения с бд и курсор нужно писать вот так:
Python
1
2
3
@query_in_session
def some_sunc(cur, con):
    .....
А хочется
Python
1
2
3
@query_in_session
def some_sunc():
    .....
Можно ли так сделать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.02.2017, 16:18
Ответы с готовыми решениями:

Генератор декораторов
Напишите генератор декораторов check_password, т. е. функцию, которая возвращает декоратор. Генератор декораторов принимает в качестве...

Генератор декораторов
Напишите генератор декораторов check_password, т. е. функцию, которая возвращает декоратор. Генератор декораторов принимает в качестве...

Python понимание декораторов
Всем добрый день! Начал разбираться с декораторами. В принципе, все понятно, кроме одного момента. Я понимаю, что в неправильном...

47
 Аватар для Zuzik
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557
25.02.2017, 21:49  [ТС]
Студворк — интернет-сервис помощи студентам
actionpattern, скажите пожалуйста, что же такое по вашему лямды в языках программирования и чем они отличаются от функций? И что на ваш взгляд главнее/важнее - функция или лямбды?
0
Заблокирован
25.02.2017, 21:53
Zuzik, ничем не отличаются. Есть объект: функция, на нее можно накидать кучу ссылок, можно еще наименовать сверху.
0
 Аватар для Zuzik
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557
25.02.2017, 22:08  [ТС]
Цитата Сообщение от actionpattern Посмотреть сообщение
А зачем вообще использовать декораторы, ведь это не более чем убогая обертка над лямбдой.
Цитата Сообщение от actionpattern Посмотреть сообщение
кто его вообще не знает,
А вы в курсе, что вы этими словами сказали чушь? Декоратор это удобный синтаксический сахар, оборачивающий функции. Потому как лямбда в питоне, это ни что иное как обычная функция.
Python
1
2
3
4
5
6
7
8
9
10
11
12
>>> a = lambda :1
>>> a
<function <lambda> at 0x7f4645983a60>
>>> def b():
...     return 1
... 
>>> b
<function b at 0x7f4645983ae8>
>>> type(a)
<class 'function'>
>>> type(b)
<class 'function'>
0
Заблокирован
25.02.2017, 22:26
Цитата Сообщение от Zuzik Посмотреть сообщение
Потому как лямбда в питоне, это ни что иное как обычная функция.
В любом нормальном языке то же самое. Но в пистоне кривой синтаксис.

Впрочем, не понимаю, какое это имеет отношение к делу. Могу лишь повторить
А зачем вообще использовать декораторы, ведь это не более чем убогая обертка над лямбдой.
Если хотите называйте лямбду ф-цией, мне по барабану, только на вопрос ответьте уже наконец, если знаете ответ
0
 Аватар для Zuzik
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557
25.02.2017, 22:32  [ТС]
actionpattern, на какой вопрос?
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
25.02.2017, 22:34
actionpattern, что то я пропустил вопрос "зачем нужна убогая обертка над лямбдой"? наверное самым ярким примером будет flask. ну и попроще будут декораторы staticmethod и classmethod
0
Заблокирован
25.02.2017, 22:43
Wi0M, целый фреймверк ради этой чуши изучать проблематично. Вы на конкретном примере поясните. Зачем этот костыль? Вот, типа, без костыля было плохо, а применили костыль, и стало хорошо. Пример желательно попроще.

Добавлено через 6 минут
Wi0M, по той ссылке, которую я кидал, как раз показано совершенно ясно, что костыль этот не нужен, и все прекрасно решается без него. Клоунада какая-то.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def my_shiny_new_decorator(function_to_decorate):
...     # Внутри себя декоратор определяет функцию-"обёртку". Она будет обёрнута вокруг декорируемой,
...     # получая возможность исполнять произвольный код до и после неё.
...     def the_wrapper_around_the_original_function():
...         print("Я - код, который отработает до вызова функции")
...         function_to_decorate() # Сама функция
...         print("А я - код, срабатывающий после")
...     # Вернём эту функцию
...     return the_wrapper_around_the_original_function
...
>>> # Представим теперь, что у нас есть функция, которую мы не планируем больше трогать.
>>> def stand_alone_function():
...     print("Я простая одинокая функция, ты ведь не посмеешь меня изменять?")
...
>>> stand_alone_function()
Я простая одинокая функция, ты ведь не посмеешь меня изменять?
>>> # Однако, чтобы изменить её поведение, мы можем декорировать её, то есть просто передать декоратору,
>>> # который обернет исходную функцию в любой код, который нам потребуется, и вернёт новую,
>>> # готовую к использованию функцию:
>>> stand_alone_function_decorated = my_shiny_new_decorator(stand_alone_function)
>>> stand_alone_function_decorated()
Я - код, который отработает до вызова функции
Я простая одинокая функция, ты ведь не посмеешь меня изменять?
А я - код, срабатывающий после
чем это хуже?
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
25.02.2017, 22:50
actionpattern, вы прикалываетесь? вот теперь мне все совершенно ясно))

Добавлено через 1 минуту
вы наверняка и вместо + пишите __add__(), или используете побитовые сдвиги))) не понимая для чего нужен "костыль" с +

Добавлено через 59 секунд
и я сказал что, "ну и попроще будут декораторы staticmethod и classmethod". берете и гуглите
0
Заблокирован
25.02.2017, 22:53
Wi0M, нет я не прикалываюсь, я совершенно серьезно. Я сам на пистоне не пишу, но код прочитать могу. Соответственно, меня интересует, что это может дать в дополнение к тому, что уже и так есть. Выглядит комично

Добавлено через 2 минуты
Цитата Сообщение от Wi0M Посмотреть сообщение
не понимая для чего нужен "костыль" с +
ну, это еще можно обосновать полиморфизмом, хотя, на самом деле это тоже легкий декор для баб.
К тому же в нормальных ЯП + можно сделать обычным методом. Ну это ладно.
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
25.02.2017, 22:59
вы вообще понимаете что
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def my_shiny_new_decorator(function_to_decorate):
...     # Внутри себя декоратор определяет функцию-"обёртку". Она будет обёрнута вокруг декорируемой,
...     # получая возможность исполнять произвольный код до и после неё.
...     def the_wrapper_around_the_original_function():
...         print("Я - код, который отработает до вызова функции")
...         function_to_decorate() # Сама функция
...         print("А я - код, срабатывающий после")
...     # Вернём эту функцию
...     return the_wrapper_around_the_original_function
...
>>> # Представим теперь, что у нас есть функция, которую мы не планируем больше трогать.
>>> def stand_alone_function():
...     print("Я простая одинокая функция, ты ведь не посмеешь меня изменять?")
...
>>> stand_alone_function()
Я простая одинокая функция, ты ведь не посмеешь меня изменять?
>>> # Однако, чтобы изменить её поведение, мы можем декорировать её, то есть просто передать декоратору,
>>> # который обернет исходную функцию в любой код, который нам потребуется, и вернёт новую,
>>> # готовую к использованию функцию:
>>> stand_alone_function_decorated = my_shiny_new_decorator(stand_alone_function)
>>> stand_alone_function_decorated()
Я - код, который отработает до вызова функции
Я простая одинокая функция, ты ведь не посмеешь меня изменять?
А я - код, срабатывающий после
и

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def my_shiny_new_decorator(function_to_decorate):
...     # Внутри себя декоратор определяет функцию-"обёртку". Она будет обёрнута вокруг декорируемой,
...     # получая возможность исполнять произвольный код до и после неё.
...     def the_wrapper_around_the_original_function():
...         print("Я - код, который отработает до вызова функции")
...         function_to_decorate() # Сама функция
...         print("А я - код, срабатывающий после")
...     # Вернём эту функцию
...     return the_wrapper_around_the_original_function
...
>>> @my_shiny_new_decorator
...  def stand_alone_function():
...     print("Я простая одинокая функция, ты ведь не посмеешь меня изменять?")
...
>>> # Однако, чтобы изменить её поведение, мы можем декорировать её, то есть просто передать декоратору,
>>> # который обернет исходную функцию в любой код, который нам потребуется, и вернёт новую,
>>> # готовую к использованию функцию:
>>> stand_alone_function_decorated()
Я - код, который отработает до вызова функции
Я простая одинокая функция, ты ведь не посмеешь меня изменять?
А я - код, срабатывающий после
одно и тоже))))

Добавлено через 3 минуты
actionpattern, вот оно и наглядно что деректива @ это синтаксический сахар, чтобы писать меньше кода. иногда метод хочется обернуть в 2 и даже в 3 декоратора. я могу еще интереснее пример дать. с потоками. когда для того чтобы запустить метод в потоке достаточно будет прописать декоратор методу, и еще один декоратор для блокировки метода. показать?))
0
Заблокирован
25.02.2017, 23:01
Цитата Сообщение от Wi0M Посмотреть сообщение
одно и тоже))))
Ну, и зачем декоратор нужен?

Это, кстати говоря не одно и то же. Насколько я понимаю, декоратор -- синтаксическая конструкция, име нельзя так легко манипулировать как обычной функцией, не?
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
25.02.2017, 23:01
в пайтоне есть sum()
0
Заблокирован
25.02.2017, 23:07
Цитата Сообщение от Wi0M Посмотреть сообщение
чтобы писать меньше кода
насколько меньше то? на 3 строки? На спичках что-ли экономите?

Добавлено через 4 минуты
Цитата Сообщение от Wi0M Посмотреть сообщение
в пайтоне есть sum()
я про то, что можно написать вот так, типа:
Code
1
2
3
4
5
6
7
8
String + = //definition here
Array + = //definition here
test = function(arg) -> arg + arg
 
test(stringInstance)
test(arrayInstance)
test(numberInstance)
test(anythingWithPlusDefinitionInstance)
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
25.02.2017, 23:10
actionpattern, нет, когда вы ставите дерективу @ над методом, то вызывается декоратор, это происходит до выполнения кода, поэтому декоратор должен быть объявлен до его применения. соответственно и пример
Python
1
stand_alone_function = my_shiny_new_decorator(stand_alone_function)
тоже самое что
Python
1
2
3
@my_shiny_new_decorator
def stand_alone_function():
    print("Я простая одинокая функция, ты ведь не посмеешь меня изменять?")
вы в декоратор передаете метод, что через @ что через прямой вызов декоратора, и он возвращает не результат выполнения метода, а указатель на обернутый метод. который уже и вызывается.
Python
1
2
stand_alone_function()
my_shiny_new_decorator(stand_alone_function)()
и я повторюсь, этот сахар нужен чтобы облегчить чтение кода. и чтобы облегчить его написание. и в пайтоне очень много синтаксического сахара. это и делает его удобным.

Добавлено через 1 минуту
actionpattern, хм... чтобы понять это вам нужно взять и попробовать)
0
Заблокирован
25.02.2017, 23:12
Цитата Сообщение от actionpattern Посмотреть сообщение
написать вот так, типа:
или так:
Code
1
2
3
4
5
6
7
8
String + = //definition here
Array + = //definition here
test = function(arg, fun) -> arg func(arg)
 
test(stringInstance, +)
test(arrayInstance, +)
test(numberInstance, +)
test(anythingWithPlusDefinitionInstance, +)
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
25.02.2017, 23:13
просто кому как) мне удобнее так
Python
1
2
3
4
5
@th_pool.thread
@th_poot.lock
@time
def foo():
    pass
чем так
Python
1
foo = th_pool.thread(th_poot.lock(time(foo)))
0
Заблокирован
25.02.2017, 23:14
Цитата Сообщение от Wi0M Посмотреть сообщение
нет, когда вы ставите дерективу @ над методом, то вызывается декоратор, это происходит до выполнения кода
Что нет? Я это и сказал. Код с декоратором будет неэквивалентен функции, возвращающей другую функцию, это неполноценный объект языка, так что в конечном итоге это негативно скажется на коде, когда нужно будет сделать что то нетривиальное.
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
25.02.2017, 23:17
Цитата Сообщение от actionpattern Посмотреть сообщение
Цитата Сообщение от actionpattern Посмотреть сообщение
написать вот так, типа:
или так:
Код
String + = //definition here
Array + = //definition here
test = function(arg, fun) -> arg func(arg)
test(stringInstance, +)
test(arrayInstance, +)
test(numberInstance, +)
test(anythingWithPlusDefinitionInstance, +)
и зачем? я так и в пайтоне могу сделать

Добавлено через 2 минуты
Цитата Сообщение от actionpattern Посмотреть сообщение
декоратор -- синтаксическая конструкция, име нельзя так легко манипулировать как обычной функцией, не?
вот это тоже не верное утверждение.
0
Заблокирован
25.02.2017, 23:22
Цитата Сообщение от Wi0M Посмотреть сообщение
вот это тоже не верное утверждение
вы можете сделать вот так
Code
1
2
3
4
5
6
7
8
foo = function(decorator) -> {
   decorator 
   def stand_alone_function():
    print("Я простая одинокая функция, ты ведь не посмеешь меня изменять?")
   return stand_alone_function
  }
 
foo(@my_shiny_new_decorator)
?
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
25.02.2017, 23:25
actionpattern,
Python
1
2
3
4
5
def foo(decorator):
    def stand_alone_function():
        print("Я простая одинокая функция, ты ведь не посмеешь меня изменять?")
    decorator()
    return stand_alone_function
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.02.2017, 23:25

Нужно реализовать задачу с использованием итераторов и декораторов
Помогите пожалуйста, реализовать задачу с использованием итераторов и декораторов. from random import randint # Создание списка,...

Реализация декораторов вне зависимости от количества аргументов и их имен
Доброго времени. У меня есть код с декораторами def bold(x): def wrapped(): return &quot;&lt;b&gt;&quot; + x() +...

Задача "Генератор декораторов"
Напишите генератор декораторов check_password, т. е. функцию, которая возвращает декоратор. Генератор декораторов принимает в качестве...

Разработка, отладка и испытание программ с применением декораторов свойств классов
Продемонстрируйте работу декоратора через задание свойств объекта класса конструктором, сеттером и непосредстсвенным изменением значения...

С помощью декораторов устранить уязвимость Фродо к Назгулам и оку Саурона.
Люди добрые, прошу помочь с решение задачи на декораторы... Мерри и Пиппин, утащившие палантир у Сарумана с ужасом обнаружили, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru