Oleg
всё равно не понял, что под капотом у return wrapper
How
Кстати, @decorator может работать с объектами? Это ведь просто сахар, ему всё равно, что принимать, верно?
Oleg
в питоне всё объект
Aragaer
под капотом у return wrapper возвращение результата же
Aragaer
ну то есть как @my_decorator def my_func(): бла-бла
Oleg
return wrapper я так понимаю это возврат адреса на функцию, но зачем?
Aragaer
можно переписать (и будет примерно то же самое) так: def some_func(): бла-бла my_func = my_decorator(some_func)
Oleg
это понятно
Aragaer
"обернутая в декоратор" функция на самом деле заменяется на другую
Oleg
зачем декоратор возвращает адрес на самого себя?
Aragaer
вот то, что ты ретурном из декоратора вернешь, на это и заменяется
Aragaer
не себя
Aragaer
а враппера, определенного внутри себя
Oleg
ну да
Oleg
зачем?
Aragaer
ну я и сказал, зачем
Aragaer
"обернутая в декоратор" функция на самом деле заменяется на другую
How
Ну с классами есть декораторы
Ну встроенный сахар @decorator - ему же всё равно, что принимать? Или с ним только callable обернуть можно?
Aragaer
только callable
Aragaer
ща
Aragaer
>>> def my_decorator(func): ... print("I got a", func) ... >>> @my_decorator ... def my_func(): ... print(42) ... I got a <function my_func at 0x7f5e7c3e4ae8> >>> print(my_func) None
Aragaer
вот я из my_decorator ничего не вернул (то есть вернул None) и в итоге символ my_func равен именно этому None
Aragaer
чую, что загрузил
Oleg
экпериментируем, пытаемся понять сами ))
Oleg
я так и не догнал зачем тот return ))
Aragaer
то, что передается в этот return, будет подставлено в оборачиваемый символ вместо того, что там есть
Aragaer
еще раз - вот ты пишешь просто так def функция какой-то код
Aragaer
это _исходная_ реализация функции
Eugene
Я сделал генератор ключей, после того, как ключ сгенерировался он идет в словарь, я с помощью модуля colorama после генерации даю ему цвет, а когда вывожу словарь, то цвета нет. Как сделать чтобы цвет после генерации оставался и был именно у этого ключа?
Oleg
а почему return wrapper, а не return wrapper() ?
Oleg
суть понял, а со скобками пока нет )
Oleg
мы же вызываем wrapper, как функцию
Misha
а почему return wrapper, а не return wrapper() ?
потому что нужно вернуть обьект функции а не результат ее вызова
Oleg
по идее со скобками должно быть
Oleg
а в чём разница?
Oleg
она же должна запуститься
Oleg
/def benchmark(func): import time def wrapper(*args, **kwargs): start = time.time() func(*args, **kwargs) end = time.time() print('[*] Время выполнения: {} секунд.'.format(end - start)) return wrapper @benchmark def fetch_webpage(url): import requests webpage = requests.get(url) fetch_webpage('https://google.com')
Misha
вопрос когда она должна запуститься, тебе же не нужно ее вызывать в момент обьявления
Oleg
вот на примере этого смотрю
Misha
ну попробуй добавить скобки, если интересно
Oleg
есть функция в бенчмарке, я так понимаю в return wrapper я как раз её и вызываю
Aragaer
а почему return wrapper, а не return wrapper() ?
нет, мы ее не вызываем
Aragaer
мы ее возвращаем. А вызываться она будет каждый раз, когда вызывается та, которую мы оборачивали
Aragaer
итак. Ты определил функцию с некоторой исходной реализацией. Затем ты передал ее в декоратор. Декоратор принял аргументом функцию с исходной реализацией, а наружу вернул функцию с новой реализацией
Aragaer
эта новая реализация будет присвоена тому же символу, что и раньше, но вместо исходной реализации
Anonymous
можно ли через селениум отправить пост запрос?
Aragaer
>>> def my_decorator(func): ... def inner(): ... print("hello") ... return inner ... >>> @my_decorator ... def f(): ... print("world") ... >>> f() hello
Oleg
любой запрос можно
Aragaer
функция inner вызывается тогда, когда вызывается f
Anonymous
мне пост запрос именно нужен
Anonymous
любой запрос можно
как можно это сделать?
Aragaer
потому что f и есть inner
Alexander
Вопрос такой. def f(x,y, param1, param2, param3): z = param1*x*x + param2*x*y + param3*y*y return z Как мне получить F(x,y) которая будет вычислять тот же z, при фиксированных значениях param1, param2, param3? Тут пахнет декораторами, но не могу придумать как использовать.
Alexander
functools.partial
Спасибо
Valera
Привет. У меня есть два списка: my_list_1 = [{'user_id': 1, 'some_info': [...]}, {'user_id': 2, 'some_info': [...]}] my_list_2 = [{'user_id': 1, 'other_info': [...], 'reg_data': '...'}, {'user_id': 2, 'other_info': [...], 'reg_data': '...'}] То есть user_id есть в том и другом списке и агарнтировано, что id будет совпдаать. Вопрос - как в словарях my_list_1 обнвоить инфу, взятую из my_list_2
Daniil
Осортировать оба списка по user_id, затем проходится по спискам и формировать из них словарь, например так dict(mylist2, **mylist1)
Oleg
эта новая реализация будет присвоена тому же символу, что и раньше, но вместо исходной реализации
def benchmark(func): def wrapper1(): func() print('wrapper1') def wrapper2(): print("wrapper2") return wrapper2 @benchmark def fetch_webpage(): print('Главная') fetch_webpage()
Oleg
вот на этом примере разобрался
Oleg
таки в return мы говорим какую функцию нужно запустить
Aragaer
собственно "во что должно превратиться завернутое"
Kop
как можно это сделать?
открыть документацию
Oleg
собственно "во что должно превратиться завернутое"
или так ) суть та же, смущало, что нет скобок
Aragaer
>>> d1 = {'a': 1, 'b': 2} >>> d2 = {'a': 3, 'b': 4} >>> d1.update(d2) >>> d1 {'a': 3, 'b': 4}
Valera
у словаря есть метод update
это я знаю, но мне же нужно брать определенный словарь в этом списке, чтобы его обновить
Aragaer
или так ) суть та же, смущало, что нет скобок
а это от отсутствия интуитивного понимания, что такое скобки
Aragaer
func это функция. Вот прям сама функция, которую можно вызывать
Aragaer
func() это результат вызова этой функции. Его уже далеко не факт, что можно вызывать
Aragaer
return wrapper означает - вернуть функцию, потому что она будет теперь жить вместо старой
Valera
Daniil
да, так можно. Но это не тот случай. У меня дургие данные на входе
Осортировать оба списка по user_id, затем проходится по спискам и формировать из них словарь, например так dict(mylist2, **mylist1)
Daniil
Это не помогло?
Aragaer
return wrapper() означает - вызвать сейчас функцию, а вернуть только ее результат - и вместо старой функции будет уже только результат новой
Aragaer
for user, data in dict1.items(): data.update(dict2[user])
Oleg
да, т.е. эта запись по сути означает return wrapper заменить функцию ниже декоратора на эту
Oleg
swap такой себе )
Aragaer
сам по себе декоратор означает заменить функцию на то, что вернет декоратор