I Decoratori in Python: Una Guida Introduttiva

Python

Un decoratore in Python è una funzione che prende un'altra funzione come argomento, aggiunge delle funzionalità e restituisce una nuova funzione. È un design pattern molto potente che permette di estendere il comportamento di una funzione senza modificarne il codice sorgente. La sintassi per applicare un decoratore è `@nome_decoratore`.

Un Problema: Misurare il Tempo di Esecuzione

Immagina di avere due funzioni e di voler misurare quanto tempo impiega ognuna a essere eseguita. L'approccio naif sarebbe:

import time

def funzione_lenta():
    start_time = time.time()
    # ... codice della funzione ...
    end_time = time.time()
    print(f"Tempo impiegato: {end_time - start_time}s")

def altra_funzione_lenta():
    start_time = time.time()
    # ... altro codice ...
    end_time = time.time()
    print(f"Tempo impiegato: {end_time - start_time}s")

Questo codice è ripetitivo e "sporca" la logica principale delle funzioni. Qui un decoratore è la soluzione perfetta.

La Soluzione con un Decoratore

Creiamo una funzione `timer_decorator` che fungerà da decoratore. Questa funzione definisce una "funzione wrapper" interna che contiene la logica di misurazione del tempo.

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs) # Esegue la funzione originale
        end_time = time.time()
        print(f"La funzione '{func.__name__}' ha impiegato {end_time - start_time:.4f}s")
        return result
    return wrapper

Ora possiamo "decorare" le nostre funzioni in modo pulito:

@timer_decorator
def funzione_lenta():
    time.sleep(2)

@timer_decorator
def altra_funzione_lenta(x, y):
    time.sleep(1)
    return x + y

funzione_lenta()
altra_funzione_lenta(5, 3)

Output:

La funzione 'funzione_lenta' ha impiegato 2.0034s
La funzione 'altra_funzione_lenta' ha impiegato 1.0012s

Abbiamo separato la logica di timing (la "cross-cutting concern") dalla logica di business. I decoratori sono usati estensivamente in framework web come Flask e FastAPI per compiti come la gestione dell'autenticazione, il logging e il caching.

Cosa Possiamo Fare per Te

Scriviamo codice Python pulito, modulare e manutenibile, seguendo le best practice del settore. Che si tratti di creare applicazioni web, API o script di automazione, il nostro approccio garantisce software robusto e facile da estendere in futuro. La conoscenza di pattern avanzati come i decoratori ci permette di creare soluzioni eleganti ed efficienti.

Richiedi un code review

Hai bisogno di una soluzione su misura?

Dalla Web App al gestionale custom, trasformiamo le tue idee in software performante. Contattaci per una consulenza gratuita.

Richiedi una consulenza