Decoratori Python Spiegati con Esempi Pratici

Cosa fa davvero un decoratore alla tua funzione Vuoi misurare il tempo di ogni funzione che chiama un鈥橝PI esterna lenta. Puoi incollare chiamate a time.perf_counter() in ognuna, oppure scrivere la misurazione una sola volta e applicarla ovunque. Un decoratore 猫 la seconda opzione: 猫 una funzione che prende un鈥檃ltra funzione, la avvolge in un comportamento aggiuntivo e restituisce la versione avvolta con lo stesso nome originale. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import time def timed(func): def wrapper(*args, **kwargs): start = time.perf_counter() result = func(*args, **kwargs) elapsed = time.perf_counter() - start print(f"{func.__name__} took {elapsed:.3f}s") return result return wrapper @timed def fetch_price(ticker): time.sleep(0.2) # al posto di una chiamata di rete return 142.50 fetch_price("AAPL") # fetch_price took 0.201s @timed sopra def fetch_price 猫 l鈥檃bbreviazione di fetch_price = timed(fetch_price). Python chiama timed una sola volta, subito dopo la definizione di fetch_price, e ricollega il nome fetch_price a quello che timed restituisce. Tutto quello che fa la @ 猫 questo. ...

7 ottobre 2026 路 7 minuti 路 1329 parole 路 SpaghettiCoder

Perch茅 0.1 + 0.2 Non Fa 0.3: la Virgola Mobile Spiegata

Esegui 0.1 + 0.2 in una shell Python e non ottieni 0.3. Ottieni 0.30000000000000004. Prova in JavaScript, Java, Go, C o Rust e trovi la stessa coda di sedici cifre. Ognuno di questi linguaggi fa esattamente quello che impone lo standard hardware. Un numero che richiederebbe infinite cifre binarie viene compresso in 64 bit, e qualcosa deve cedere. Perch茅 0.1 non si pu貌 memorizzare esattamente in binario I computer memorizzano i numeri in virgola mobile in base 2. In base 2, la frazione 1/10 ha uno sviluppo periodico, proprio come 1/3 si ripete all鈥檌nfinito in base 10 (0.3333...). Scritto per intero, 0.1 in binario inizia cos矛: ...

6 ottobre 2026 路 6 minuti 路 1173 parole 路 SpaghettiCoder

Notazione Big O Spiegata con Esempi di Codice

Una lookup su un dizionario Python impiega circa 100 nanosecondi, che il dizionario contenga 1.000 chiavi o 1.000.000. Un doppio ciclo che cerca duplicati in una lista impiega mezzo millisecondo su 200 elementi e 136 millisecondi su 3.200. Sedici volte l鈥檌nput, quasi 280 volte l鈥檃ttesa. Stessa macchina, stesso Python. La notazione Big O 猫 il nome di quella differenza. Cosa misura la notazione Big O Big O descrive come cresce il tempo di esecuzione (o l鈥檜so di memoria) di un pezzo di codice all鈥檃umentare dell鈥檌nput. Non 猫 una lettura al cronometro e non le importa se il tuo portatile 猫 veloce o lento. Le interessa la forma della curva di crescita: raddoppiando l鈥檌nput, il tempo raddoppia, quadruplica, o si muove appena? ...

4 ottobre 2026 路 8 minuti 路 1678 parole 路 SpaghettiCoder

Git Reset vs Revert vs Restore: differenze e come usarli

Esegui git reset --hard su un commit che il tuo team ha gi脿 scaricato e la tua storia smette di corrispondere alla loro. Esegui git revert su un typo che non hai ancora pushato e aggiungi un commit inutile al log. Git ha quattro comandi per annullare le cose: restore, reset, commit --amend e revert, e non sono intercambiabili. Scegli quello sbagliato e il risultato 猫 che non succede niente, oppure succede molto pi霉 di quanto volevi. ...

3 ottobre 2026 路 7 minuti 路 1360 parole 路 SpaghettiCoder

Cos'猫 la Dependency Injection (con Esempi)

Ecco una classe che non puoi testare senza un database live e un server SMTP funzionante: 1 2 3 4 5 6 7 8 9 10 11 public class OrderService { private readonly SqlOrderRepository _repository = new SqlOrderRepository("Server=prod-db;Database=Orders;..."); private readonly SmtpEmailSender _emailSender = new SmtpEmailSender("smtp.company.com"); public void PlaceOrder(Order order) { _repository.Save(order); _emailSender.Send(order.CustomerEmail, "Order confirmed"); } } OrderService costruisce da s茅 SqlOrderRepository e SmtpEmailSender con new, connection string compresa. Ogni test che tocca PlaceOrder richiede un vero database Orders e un vero server di posta, altrimenti fallisce prima ancora che la tua assertion venga eseguita. La logica che vuoi testare sta in due righe: salva l鈥檕rdine, invia la conferma. Ma 猫 saldata a due classi concrete che non puoi sostituire. ...

1 ottobre 2026 路 8 minuti 路 1596 parole 路 SpaghettiCoder

Test Unitari vs Test di Integrazione vs Test End-to-End

Una funzione pu貌 avere il 100% di copertura dei test unitari e la pagina che la chiama pu貌 comunque restituire un 500 in produzione. Non 猫 una contraddizione. Test unitari, test di integrazione e test end-to-end controllano cose diverse, e una suite pesante su uno e leggera su un altro ha un buco specifico e prevedibile. Cosa controllano test unitari, di integrazione ed end-to-end Prendi una funzionalit脿 di registrazione: una funzione valida l鈥檌nput, scrive una riga su un database e invia un鈥檈mail di benvenuto. Tre test possono coprirla, e ognuno risponde a una domanda diversa. ...

29 settembre 2026 路 11 minuti 路 2218 parole 路 SpaghettiCoder

Async/Await e Event Loop in JavaScript Spiegati

Esegui questo snippet in Node o nella console del browser: 1 2 3 4 console.log("1"); setTimeout(() => console.log("2"), 0); Promise.resolve().then(() => console.log("3")); console.log("4"); L鈥檕utput 猫 1 4 3 2. Un setTimeout con un ritardo di 0ms viene eseguito comunque dopo il callback della promise, ed entrambi partono solo dopo che tutto il codice sincrono, incluso quello scritto pi霉 avanti, 猫 terminato. async/await si basa su questo stesso ordine, non introduce un meccanismo nuovo. La maggior parte dei comportamenti sorprendenti nel JavaScript asincrono nasce dal trattare await come se sospendesse l鈥檌ntero programma, quando in realt脿 sospende solo la funzione in cui si trova. ...

28 settembre 2026 路 8 minuti 路 1608 parole 路 SpaghettiCoder

Cos'猫 CORS e Come Risolvere gli Errori CORS

Il frontend gira su http://localhost:5173, l鈥橝PI su http://localhost:4000, e la fetch che funzionava perfettamente in Postman fallisce nel browser con un muro di testo rosso: Access to fetch at 'http://localhost:4000/api/users' from origin 'http://localhost:5173' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Il server potrebbe aver gestito la richiesta e restituito un 200. Il browser ha semplicemente rifiutato di consegnare la risposta al tuo JavaScript. ...

26 settembre 2026 路 8 minuti 路 1613 parole 路 SpaghettiCoder

Come Configurare il Debug Remoto in Visual Studio

Debuggare un bug che si presenta solo su una macchina senza Visual Studio Un bug si riproduce sul server di test e non sul tuo laptop. Il server di test non ha Visual Studio, e installarci sopra un IDE completo solo per mettere un breakpoint non 猫 un鈥檕pzione. Il debug remoto serve esattamente per questo caso. Un piccolo programma standalone gira sulla macchina di destinazione, il tuo Visual Studio locale si collega ad esso via rete, e ottieni breakpoint e ispezione delle variabili su un processo che non gira da nessuna parte vicino alla tua scrivania. ...

23 settembre 2026 路 7 minuti 路 1404 parole 路 SpaghettiCoder