Une histoire de décorateurs Python

image



Le simple vaut mieux que le complexe.

Matériel pour ceux qui ont déjà entendu parler des décorateurs, mais ne comprennent pas pourquoi ils sont nécessaires et comment les utiliser dans leurs projets.



Permettez-moi de vous rappeler qu'un décorateur est une fonction qui vous permet d'envelopper une autre fonction pour étendre ses fonctionnalités sans changer directement son code. Plus de détails peuvent être trouvés par exemple ici



Commençons.



Il y a longtemps, dans un grand projet cosy, la fonction vivait et fonctionnait fetch_webpage:



import requests

def fetch_webpage():
    webpage = requests.get('https://google.com')
    return webpage

fetch_webpage()


En dehors:



<Response [200]>


Puis les managers sont venus et ont voulu mesurer combien cela fonctionne, cette fonction, . . :



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 était ravi et voulait réécrire tout le code d'un projet volumineux et confortable, mais il s'est vite lassé de faire des changements et est devenu triste.

Oleg a pensé à 3 sprints et 3 jours, s'est souvenu des décorateurs et était de nouveau très heureux. Voici comment résoudre ce problème avec un décorateur:



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()


En dehors:



 : 0.15940594673156738 .
<Response [200]>


Ici, tous les gestionnaires étaient ravis, ont commencé à se féliciter, avec le fait que maintenant toutes les fonctions seront apprivoisé, pas sauvage mesurable, et Oleg a même reçu une médaille ou un ordre, je ne me souviens pas exactement.




All Articles