170 похожих чатов

Товарищи, подскажите, почему декораторам обязательны замыкания? Вот не пойму, в

чём проблема в обычную, не замкающуюся функцию взять, передать туда функцию и всё это дело выполнить

40 ответов

29 просмотров

потому что не получится без замыкания использовать суть декоратора -то, что вызов функции не меняется, от того, что на нее навешан декоратор, а функционал изменяется. т.е. грубо говоря была у тебя функция: def bar(*args, **kwargs): pass а потом навесил на нее декоратор: @foo def bar(*args, **kwargs): pass и вот ты ее вызывал bar() до того как ее задекорировал и задекорировання она тоже вызывается как bar() а функционал у нее поменялся в зависимости от того, как его модифицировал декоратор

Не обязательны на самом деле

Все в реальности сложнее https://t.me/advice17/47

Джабир- Автор вопроса
Vladimir Strelets
потому что не получится без замыкания использовать...

Всё равно не понимаю. Почему декоратор не может просто взять, как в данном случае, и import time def timer(func): start = time.time() func() end = time.time() return end - start def someone_func(): time.sleep(2) передать функцию someone_func() в timer()? В чём проблема?

Джабир- Автор вопроса
Arkady Strugatsky
Не обязательны на самом деле

А как реализовать декоратор без замыкания?

Джабир
А как реализовать декоратор без замыкания?

Например с functools.partial() Алсо подозреваю что там замыкание под капотом

Tishka17
Все в реальности сложнее https://t.me/advice17/47

мм и что же по ссылке сложнее? то что могут быть декораторы отличающиеся от паттерна "Декоратор" ?)

Джабир
А как реализовать декоратор без замыкания?

Или просто вернуть функцию без изменений. В питоне декоратор это не только паттерн декоратор, но ещё используется чтобы где-то зарегистрировать функцию

Джабир- Автор вопроса
Arkady Strugatsky
Или просто вернуть функцию без изменений. В питоне...

Ну я имею ввиду конкретно то, что ставится через @

Arkady Strugatsky
def reg(func): registry.register(func) ret...

Например как во фласке ты создаёшь эндпоинты

Джабир
Всё равно не понимаю. Почему декоратор не может п...

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

Джабир- Автор вопроса
Vladimir Strelets
ну в примере который написали что делать если в фу...

import time def timer(func, *args, **kwargs): start = time.time() func(*args, **kwargs) end = time.time() return end def someone_func(*args, **kwargs): time.sleep(2) Т.е. я правильно понимаю, вы это имеете ввиду? Так всё равно же в замыкании функции которую мы вызываем также надо передать аргументы, предварительно их передав в подфункцию

Джабир- Автор вопроса
Arkady Strugatsky
def reg(func): registry.register(func) ret...

Не знаю что такое registry, но смею предположить то это тоже самое замыкание. Т.е. замыкание есть, но неявное

Vladimir Strelets
мм и что же по ссылке сложнее? то что могут быть ...

То что декоратор может вернуть совсем другую фигню или ту же функцию

Что значит замыкающаяся / не замыкающаяся функции, можно примеры?

Джабир
import time def timer(func, *args, **kwargs): ...

да, так я еще раз повторю: декоратор позволит более гибко управлять поведением функции (включать/выключать декорирование) с меньшими затратами сил

Джабир- Автор вопроса
Сергей
Что значит замыкающаяся / не замыкающаяся функции,...

https://www.youtube.com/watch?v=sJF7OMNgLUs Кратко говоря - функция, которая возвращает функцию. К возвращённой функции можно обращаться используя имена из основной, ибо основная не удаляется сборщиком мусора, ибо на неё ссылаются

Джабир
Не знаю что такое registry, но смею предположить т...

Это пример. Суть в том что ты регистрируешь функцию и возвращаешь ее же без изменений

Джабир- Автор вопроса
Vladimir Strelets
да, так я еще раз повторю: декоратор позволит боле...

Да! Я вас понимаю, но вопрос в том, почему блин декоратор использует именно замыкание? Он не может в обычную функцию запихать декорируемую и там её выполнить? Вот в чём непонятки

Джабир
Да! Я вас понимаю, но вопрос в том, почему блин де...

"Он не может в обычную функцию запихать декорируемую и там её выполнить?" как это может выглядеть (Если на псевдокоде)?

Давай проясним. В какой момент вызывается код декоратора?

Джабир- Автор вопроса
Джабир
В тот момент когда вызывается функция

Нет. Сразу после того как функция появилась в памяти

Джабир
Да! Я вас понимаю, но вопрос в том, почему блин де...

Каждый конкретный декоратор может использовать или не использовать замыкание. Часто исходя из того, что мы пишем, он генерирует новую функцию и нужен доступ к аргументу самого декоратора (оригинальной функции) - это и есть замыкание. Но это можно реализовать и другими способами (например, через partial или классы). А иногда это вообще не нужно

Джабир- Автор вопроса
Tishka17
Каждый конкретный декоратор может использовать или...

Нужен доступ к аргументу самого декоратора? Но в декоратор, же обычно передаётся только сама функция, а аргументы уже в подфункции. В каком случае передаются аргументы в оригинальную функцию?

Джабир
Нужен доступ к аргументу самого декоратора? Но в д...

Я же написал, доступ к оригинальной функции, щас поправлю формадировку

Джабир
Нужен доступ к аргументу самого декоратора? Но в д...

могут передаваться аргументы для работы самого декоратора например декоратор с пробросом аргумента для ретраев вызова функции )

стоит дотошно разобраться в теме, тогда большая часть "магии" в декораторах пропадет) вот тут неплохая статья https://habr.com/ru/articles/141411/ а у Балакирева на selfedu замыкания и декораторы разобраны с примерами и схемами, должно помочь

Джабир- Автор вопроса
Джабир
Да, вот именно что я учился по selfedu

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

Джабир- Автор вопроса
Vladimir Strelets
ну тогда как минимум то что происходит внутри замы...

Да, вот в замыканиях я вполне себе разобрался. Что-то ссылается на подфункцию, а раз что-то ссылается на подфункцию, сборщик мусора не трогает саму функцию. Ну а раз сборщик мусора не трогает саму функцию, нам доступны её имена и мы можем с ними чо угодно делать

Джабир- Автор вопроса
Tishka17
Каждый конкретный декоратор может использовать или...

А можно псевдопример, генерации новой функции? И ещё вопрос: использует или не использует замыкание - подразумевается, использует или не использует ту внешнюю область (т.е. область основной функции, не убираемой сборщиком)?

Джабир
А можно псевдопример, генерации новой функции? И ...

def func_generator(a): def inner_function(): print(a) return inner_function вот тебе генератор функции с замыканием

Джабир- Автор вопроса
Tishka17
def func_generator(a): def inner_function(): ...

Почему генератор? Это же же функция с замыканием, которая просто возвращает подфункцию, на которую можно ссылаться

Tishka17
Каждый конкретный декоратор может использовать или...

https://stackoverflow.com/questions/2497801/closures-are-poor-mans-objects-and-vice-versa-what-does-this-mean 😛

Джабир
import time def timer(func, *args, **kwargs): ...

в общем я подумал, мне кажется вопрос в принципе поставлен неверно. и дело не в замыкании, а в том что мы должны вернуть новую функцию. в примерах с таймером мы вызываем timer, передавая ему нужную функцию. а в питоновских декораторах вызов декоратора имеет ту же сигнатуру, что и вызов функции, мне кажется именно в этом причина использования внутр. функции, которую возвращаем (чтобы можно было присвоить переменной, хранящей начальную ф-цию. и вызывать в тех же местах), а не в замыкании

Похожие вопросы

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта