Eine Geschichte von Python-Dekorateuren

Bild



Einfach ist besser als komplex.

Material für diejenigen, die bereits von Dekorateuren gehört haben, aber nicht verstehen, warum sie benötigt werden und wie sie in ihren Projekten verwendet werden.



Ich möchte Sie daran erinnern, dass ein Dekorateur eine Funktion ist, mit der Sie eine andere Funktion umschließen können, um ihre Funktionalität zu erweitern, ohne ihren Code direkt zu ändern. Weitere Details finden Sie zum Beispiel hier



Lasst uns beginnen.



Vor langer Zeit lebte und arbeitete die Veranstaltung in einem großen, gemütlichen Projekt fetch_webpage:



import requests

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

fetch_webpage()


Aus:



<Response [200]>


Dann kamen Manager und wollten messen, wie viel es funktioniert, diese Funktion, . . :



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 war begeistert und wollte den gesamten Code eines großen und gemütlichen Projekts neu schreiben, aber er wurde schnell müde, Änderungen vorzunehmen, und wurde traurig.

Oleg dachte 3 Sprints und 3 Tage, erinnerte sich an die Dekorateure und war wieder sehr glücklich. So können Sie dieses Problem mit einem Dekorateur lösen:



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


Aus:



 : 0.15940594673156738 .
<Response [200]>


Hier freuten sich alle Manager, begannen sich gegenseitig zu gratulieren, mit der Tatsache, dass nun alle Funktionen sein werden zahm, nicht wild messbar, und Oleg erhielt sogar eine Medaille oder einen Auftrag, ich erinnere mich nicht genau.




All Articles