Oleg
всё равно не понял, что под капотом у return wrapper
How
Кстати, @decorator может работать с объектами? Это ведь просто сахар, ему всё равно, что принимать, верно?
Дмитрий
Oleg
в питоне всё объект
Aragaer
под капотом у return wrapper возвращение результата же
Aragaer
ну то есть как
@my_decorator
def my_func():
бла-бла
Oleg
return wrapper я так понимаю это возврат адреса на функцию, но зачем?
Julian 🏳️🌈
Aragaer
можно переписать (и будет примерно то же самое) так:
def some_func():
бла-бла
my_func = my_decorator(some_func)
Oleg
это понятно
Aragaer
"обернутая в декоратор" функция на самом деле заменяется на другую
Oleg
зачем декоратор возвращает адрес на самого себя?
Aragaer
вот то, что ты ретурном из декоратора вернешь, на это и заменяется
Aragaer
не себя
Aragaer
а враппера, определенного внутри себя
Oleg
ну да
Oleg
зачем?
Aragaer
ну я и сказал, зачем
Aragaer
"обернутая в декоратор" функция на самом деле заменяется на другую
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, как функцию
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
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
мне пост запрос именно нужен
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?
Тут пахнет декораторами, но не могу придумать как использовать.
Misha
Alexander
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
вот на этом примере разобрался
Oleg
таки в return мы говорим какую функцию нужно запустить
Aragaer
собственно "во что должно превратиться завернутое"
Kop
Aragaer
Привет. У меня есть два списка:
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
у словаря есть метод update
Oleg
Aragaer
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'a': 3, 'b': 4}
>>> d1.update(d2)
>>> d1
{'a': 3, 'b': 4}
Aragaer
func это функция. Вот прям сама функция, которую можно вызывать
Aragaer
func() это результат вызова этой функции. Его уже далеко не факт, что можно вызывать
Aragaer
return wrapper означает - вернуть функцию, потому что она будет теперь жить вместо старой
Valera
Daniil
Это не помогло?
Aragaer
return wrapper() означает - вызвать сейчас функцию, а вернуть только ее результат - и вместо старой функции будет уже только результат новой
Aragaer
for user, data in dict1.items():
data.update(dict2[user])
Oleg
да, т.е. эта запись по сути означает return wrapper заменить функцию ниже декоратора на эту
Oleg
swap такой себе )
Aragaer
сам по себе декоратор означает заменить функцию на то, что вернет декоратор