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.
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.
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)Calling multiply with args: (5, 4)
multiply returned: 20Implementazione 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
Padroneggiare le funzioni Python. Scopri come scrivere codice riutilizzabile utilizzando def, definire argomenti, restituire valori e comprendere l'ambito a livello locale e globale.
Gestori di contesto PythonScopri come scrivere gestori di contesto personalizzati in Python. Padroneggia il decoratore del gestore del contesto e i metodi __enter__/__exit__ per la sicurezza delle risorse.
Risorse Python consigliate
Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.
Come ordinare un elenco in Python
Scopri come ordinare un elenco in Python utilizzando il metodo sort() e la funzione sorted(). Scopri l'ordinamento delle chiavi personalizzato e gli esempi di ordine inverso.
Foglio informativo sui metodi delle stringhe Python
Una guida di riferimento completa per la manipolazione delle stringhe Python. Padroneggia la formattazione, la ricerca, la divisione, la sostituzione e il controllo delle proprietà delle stringhe.
Python vs JavaScript: quale linguaggio di programmazione è il migliore?
Un confronto completo tra Python e JavaScript. Esplora le differenze di sintassi, le prestazioni, i casi d'uso (backend e frontend) ed esempi di codifica.