Decoratori Python: funzioni di avvolgimento e modifica

Impara i decoratori Python per modificare dinamicamente il comportamento delle funzioni. Comprendere le funzioni wrapper, la sintassi @ e la gestione degli argomenti nei decoratori.

Prova nell'editor

Panoramica

I decoratori sono uno dei modelli di progettazione più eleganti e potenti di Python. Consentono agli sviluppatori di modificare o estendere il comportamento di una funzione, metodo o classe senza modificarne permanentemente il codice sorgente. Pensa a un decoratore come se racchiudesse una funzione all'interno di un'altra funzione per eseguire passaggi di pre e post-elaborazione. Ciò rende i decoratori perfetti per implementare aspetti trasversali come la registrazione, la tempistica, la convalida o il controllo degli accessi.

Fondamentalmente, i decoratori lavorano perché le funzioni Python sono cittadini di prima classe. Ciò significa che le funzioni possono essere passate come argomenti ad altre funzioni, restituite da funzioni e assegnate a variabili. Un decoratore è semplicemente una funzione che accetta un'altra funzione come argomento, definisce una funzione wrapper annidata che esegue la funzione originale insieme ad una logica aggiuntiva e restituisce questa funzione wrapper per sostituire l'originale.

Per rendere l'applicazione dei decoratori semplice e pulita, Python fornisce lo zucchero sintattico `@decorator_name`, posizionato immediatamente sopra la definizione della funzione target. Quando si chiama la funzione decorata, Python invoca invece il wrapper. Se la funzione accetta parametri, il wrapper deve accettare argomenti arbitrari (`*args` e `**kwargs`) e inoltrarli correttamente. Comprendere i decoratori ti consente di scrivere codice altamente modulare, pulito e DRY (Don't Repeat Yourself).

Codice e output di esecuzione

Un decoratore personalizzato che tiene traccia e registra i dettagli di esecuzione della funzione.

decorators.py
Prova nell'editor
def call_tracker(func):
    """Decorator that tracks and logs function execution details."""
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@call_tracker
def multiply(a, b):
    return a * b

# Calling the decorated function
result = multiply(5, 4)
Uscita terminale
Calling multiply with args: (5, 4)
multiply returned: 20

Implementazione passo dopo passo

  • Registrazione delle metriche di runtime sui monitor delle prestazioni
  • Applicazione dei controlli di autenticazione e autorizzazione sui percorsi
  • Memorizzazione nella cache o memorizzazione di risultati computazionali costosi

Domande frequenti

In che modo i decoratori gestiscono gli argomenti?

Utilizzando *args e **kwargs nella funzione wrapper nidificata, che gli consente di ricevere e inoltrare qualsiasi parametro posizionale o parola chiave alla funzione racchiusa.

È possibile applicare più decoratori a una funzione?

Sì, puoi impilarli. Verranno eseguiti in ordine dall'alto verso il basso (dall'interno all'esterno).

Argomenti correlati

Risorse Python consigliate

Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.