Mejor es simple que complejo.
Material para aquellos que ya han oído hablar de los decoradores, pero no entienden por qué son necesarios y cómo utilizarlos en sus proyectos.
Permítame recordarle que un decorador es una función que le permite ajustar otra función para extender su funcionalidad sin cambiar directamente su código. Se pueden encontrar más detalles, por ejemplo, aquí.
Empecemos.
Hace mucho tiempo, en un proyecto amplio y acogedor, vivía y trabajaba la fetch_webpage
siguiente función :
import requests
def fetch_webpage():
webpage = requests.get('https://google.com')
return webpage
fetch_webpage()
Fuera:
<Response [200]>
Luego vinieron los gerentes y querían medir cuánto funciona, esta función, ¿Es demasiado tarde por la noche?. . :
import time
import requests
def fetch_webpage():
start = time.time()
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
. :
import time
import requests
def wrapper(func):
start = time.time()
out = func()
end = time.time()
print(' : {} .'.format(end-start))
return out
def fetch_webpage():
webpage = requests.get('https://google.com')
return webpage
wrapper(fetch_webpage)
Out:
: 0.1602182388305664 .
<Response [200]>
Oleg estaba encantado y quería reescribir todo el código de un proyecto grande y acogedor, pero rápidamente se cansó de hacer cambios y se puso triste.
Oleg pensó 3 sprints y 3 días, se acordó de los decoradores y volvió a estar muy feliz. Así es como puedes resolver este problema con un decorador:
import time
import requests
def benchmark(func):
def wrapper():
start = time.time()
out = func()
end = time.time()
print(' : {} .'.format(end-start))
return out
return wrapper
@benchmark
def fetch_webpage():
webpage = requests.get('https://google.com')
return webpage
fetch_webpage()
Fuera:
: 0.15940594673156738 .
<Response [200]>
Aquí todos los gerentes estaban encantados, comenzaron a felicitarse, con el hecho de que ahora todas las funciones estarán manso, no salvaje medible, y Oleg incluso recibió una medalla u orden, no recuerdo exactamente.