[Python, Кодобред] Сказка про декораторы в Python
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Simple is better than complex.
Материал для тех, кто уже слышал про декораторы, но не понимает зачем они нужны и как их использовать в своих проектах.
Напомню, что декоратор — это функция, которая позволяет обернуть другую функцию для расширения её функциональности без непосредственного изменения её кода. Более подробно можно почитать например тут
Начнем.
Давным давно в большом, уютном проекте жила и трудилась функция fetch_webpage:
def fetch_webpage():
import requests
webpage = requests.get('https://google.com')
return webpage
fetch_webpage()
Out:
<Response [200]>
Потом пришли менеджеры и захотели измерить сколько она работает, эта функция, не слишком ли задерживается по вечерам. Позвали менеджеры программиста Олега из большого и уютного проекта. Олег выслушал менеджеров и написал новую версию функции:
def fetch_webpage():
import time
start = time.time()
import requests
webpage = requests.get('https://google.com')
end = time.time()
print('Время выполнения: {} секунд.'.format(end-start))
return webpage
fetch_webpage()
Out:
Время выполнения: 0.1602182388305664 секунд.
<Response [200]>
Менеджеры увидели такую красоту и сразу захотели измерить все функции в проекте и внедрить для них KPI.
Олег как узнал, что от него хотят, сразу стал ругаться и говорить, что он не согласен сейчас все функции переписывать, у него и так еще мультики не смотрены много работы.
А потом подумал и написал функцию wrapper, которая будет измерять время работы другой, чужой функции func и выполнять ее. Посмотрите на них внимательно:
def wrapper(func):
import time
start = time.time()
out = func()
end = time.time()
print('Время выполнения: {} секунд.'.format(end-start))
return out
def fetch_webpage():
import requests
webpage = requests.get('https://google.com')
return webpage
wrapper(fetch_webpage)
Out:
Время выполнения: 0.1602182388305664 секунд.
<Response [200]>
Олег обрадовался и захотел переписать весь код большого и уютного проекта, но быстро устал вносить изменения и стал грустить.
3 спринта и 3 дня думал Олег, вспомнил про декораторы и очень обрадовался опять. Вот так можно решить эту проблему с помощью декоратора:
def benchmark(func):
import time
def wrapper():
start = time.time()
func()
end = time.time()
print('Время выполнения: {} секунд.'.format(end-start))
return func()
return wrapper
@benchmark
def fetch_webpage():
import requests
webpage = requests.get('https://google.com')
return webpage
fetch_webpage()
Out:
Время выполнения: 0.15940594673156738 секунд.
<Response [200]>
Тут все менеджеры обрадовались, стали поздравлять друг друга, с тем, что теперь все функции будут ручными, а не дикими измеряемыми, а Олегу даже дали медаль или орден, я уже точно не помню.
===========
Источник:
habr.com
===========
Похожие новости:
- [Системное администрирование, IT-инфраструктура, SAN] Мониторинг СХД IBM Storwize при помощи Zabbix
- [Python, Алгоритмы, Визуализация данных, Графический дизайн, Дизайн] Песочный алфавит при помощи генеративных алгоритмов (перевод)
- [Python, Карьера в IT-индустрии, Статистика в IT] Зарплаты Python-разработчиков: самые большие зарплаты не в Москве, а в Воронеже нет сеньоров
- [DevOps, Kubernetes, Python] Конфигурация проекта внутри и вне Kubernetes
- [PostgreSQL, Django, Apache] Поднимаем Django стек на MS Windows
- [Python, Программирование] Парсинг и аудит
- [Занимательные задачки, Python, Учебный процесс в IT, Логические игры] DataArt запустил бесплатную платформу Kiddo — онлайн-задачник для школьников, изучающих Питон
- [Разработка веб-сайтов, Python, Открытые данные] Разработка онлайн-сервиса для инвесторов на pythonanywhere.com с использованием данных Yahoo Finance
- [GitHub, Open source, Python, Машинное обучение, Программирование] Делаем нейронную сеть, которая сможет отличить борщ от пельмешек
- [Python, Django] Как поставить Django на сервер heroku в 2020 году. 10 шагов
Теги для поиска: #_python, #_kodobred (Кодобред), #_python, #_dekoratory (декораторы), #_python, #_kodobred (
Кодобред
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 01:47
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Simple is better than complex.
Напомню, что декоратор — это функция, которая позволяет обернуть другую функцию для расширения её функциональности без непосредственного изменения её кода. Более подробно можно почитать например тут Начнем. Давным давно в большом, уютном проекте жила и трудилась функция fetch_webpage: def fetch_webpage():
import requests webpage = requests.get('https://google.com') return webpage fetch_webpage() Out: <Response [200]>
Потом пришли менеджеры и захотели измерить сколько она работает, эта функция, не слишком ли задерживается по вечерам. Позвали менеджеры программиста Олега из большого и уютного проекта. Олег выслушал менеджеров и написал новую версию функции: def fetch_webpage():
import time start = time.time() import requests webpage = requests.get('https://google.com') end = time.time() print('Время выполнения: {} секунд.'.format(end-start)) return webpage fetch_webpage() Out: Время выполнения: 0.1602182388305664 секунд.
<Response [200]> Менеджеры увидели такую красоту и сразу захотели измерить все функции в проекте и внедрить для них KPI. Олег как узнал, что от него хотят, сразу стал ругаться и говорить, что он не согласен сейчас все функции переписывать, у него и так еще мультики не смотрены много работы. А потом подумал и написал функцию wrapper, которая будет измерять время работы другой, чужой функции func и выполнять ее. Посмотрите на них внимательно: def wrapper(func):
import time start = time.time() out = func() end = time.time() print('Время выполнения: {} секунд.'.format(end-start)) return out def fetch_webpage(): import requests webpage = requests.get('https://google.com') return webpage wrapper(fetch_webpage) Out: Время выполнения: 0.1602182388305664 секунд.
<Response [200]> Олег обрадовался и захотел переписать весь код большого и уютного проекта, но быстро устал вносить изменения и стал грустить. 3 спринта и 3 дня думал Олег, вспомнил про декораторы и очень обрадовался опять. Вот так можно решить эту проблему с помощью декоратора: def benchmark(func):
import time def wrapper(): start = time.time() func() end = time.time() print('Время выполнения: {} секунд.'.format(end-start)) return func() return wrapper @benchmark def fetch_webpage(): import requests webpage = requests.get('https://google.com') return webpage fetch_webpage() Out: Время выполнения: 0.15940594673156738 секунд.
<Response [200]> Тут все менеджеры обрадовались, стали поздравлять друг друга, с тем, что теперь все функции будут ручными, а не дикими измеряемыми, а Олегу даже дали медаль или орден, я уже точно не помню. =========== Источник: habr.com =========== Похожие новости:
Кодобред ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 01:47
Часовой пояс: UTC + 5