Una historia de decoradores de Python

imagen



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_webpagesiguiente 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.




All Articles