Introduzione ai Decorator
Scorri per mostrare il menu
Un decoratore in Python è una funzione di ordine superiore che prende un'altra funzione come argomento e restituisce una nuova funzione che estende o modifica il comportamento della funzione originale.
I decoratori sono una caratteristica fondamentale in Python che permettono di modificare o migliorare il comportamento di funzioni o metodi senza modificare direttamente il loro codice. Alla base, i decoratori sono funzioni di ordine superiore: prendono un'altra funzione come argomento, ne estendono o modificano il comportamento e restituiscono una nuova funzione. In Python, la sintassi per applicare un decoratore è il simbolo @ seguito dal nome del decoratore, posizionato direttamente sopra la definizione della funzione.
Esempi comuni di utilizzo dei decoratori includono:
- Logging;
- Misurazione del tempo di esecuzione delle funzioni;
- Controllo degli accessi o permessi;
- Memoizzazione (caching dei risultati);
- Validazione degli input.
I decoratori permettono di mantenere questa logica separata dalla logica principale dell'applicazione, rendendo il codice più pulito e manutenibile. Padroneggiando i decoratori, si acquisisce uno strumento potente per scrivere codice Python riutilizzabile ed espressivo.
12345678910111213def simple_decorator(func): def wrapper(*args, **kwargs): print("Before the function call") result = func(*args, **kwargs) print("After the function call") return result return wrapper @simple_decorator def greet(name): print(f"Hello, {name}!") greet("Alice")
Comprensione di args e kwargs nelle definizioni di funzione
Quando si scrivono decorator e wrapper, spesso è necessario gestire funzioni che accettano un numero qualsiasi o tipi diversi di argomenti. Python fornisce *args e **kwargs per rendere ciò possibile.
*argsraccoglie tutti gli argomenti posizionali extra passati a una funzione in una tupla;**kwargsraccoglie tutti gli argomenti con parola chiave extra in un dizionario.
Questa flessibilità è fondamentale per i decorator. Un decorator deve essere in grado di accettare e inoltrare tutti gli argomenti alla funzione originale, indipendentemente dal loro numero o tipo. Senza *args e **kwargs, il decorator funzionerebbe solo con funzioni che hanno una firma fissa, limitando la riutilizzabilità.
123456789101112def my_decorator(func): def wrapper(*args, **kwargs): print("Arguments:", args) print("Keyword arguments:", kwargs) return func(*args, **kwargs) return wrapper @my_decorator def example(a, b, greeting="Hello"): print(f"{greeting}, {a} and {b}!") example(1, 2, greeting="Hi")
Questo approccio garantisce che il decorator possa avvolgere qualsiasi funzione, rendendo il codice sia robusto che riutilizzabile.
1. Qual è lo scopo del simbolo @ in Python?
2. Come modifica un decoratore il comportamento di una funzione?
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione