Mi è venuto in mente che potrebbe essere utile elencare alcuni tipi di errori difficili da individuare.
Commentate sotto con quelli che ritenete più strani E CHE SAPETE COME INDIVIDUARE.
- funzioni ricorsive che non convergono ai casi base entro un numero di chiamate sufficientemente piccolo
- Python viene inizializzato con una profondità di stack sufficiente al suo normale uso, ma se la vostra funzione ricorsiva esegue troppe chiamate può consumare tutto lo stack
- Sintomo: errore di max depth recursion oppure INTERNALERROR
- Cura: aumentate la dimensione dello stack oppure riducete la profondità delle chiamate ricorsive (ad esempio evitate di scandire una immagine ricorsivamente)
- immagini con pixel RGB che non sono interi compresi nel range 0-255
- Succede di lasciare i valori calcolati per i canali RGB di un colore come float oppure interi >255 o <0
- Sintomo: eccezione dalla libreria png quando salvate l'immagine
- Cura: usate round per passare da float a intero e limitate i valori tra 0 e 255
- argomenti con valori di default mutabili
- il valore dell'argomento di default viene istanziato all'atto della definizione della funzione, e quindi viene condiviso tra tutte le chiamate della funzione. Se il valore è mutabile (dict, set, list ...) allora ci si può trovare con effetti collaterali noiosissimi.
- Sintomo: il codice da solo mi funziona ma nei test no
- Cura: inizializzate la variabile a None e valorizzatela al valore mutabile solo DENTRO la funzione
- caching di strutture dati: questo avviene se usate variabili globali e/o variabili di classe (o gli argomenti di default mutabili)
- di nuovo, condividerete tra più chiamate la stessa variabile con effetti collaterali fastidiosi
- Sintomo: il codice da solo mi funziona ma nei test no
- Cura: attenti a come usate le globali e variabili di classe, meglio evitarle
- cattura di eccezioni usate dal sistema di test
- il test di ricorsione sfrutta il lancio di una eccezione nella chiamata ricorsiva. Se il vostro codice "chiude" la chiamata in una clausola try/except l'eccezione viene catturata, non risale fino al test e fallite i test.
- Sintomo: non passate i test di ricorsione anche se avete fatto la funzione ricorsiva
- Cura: usate una clausola except che cattura SOLO le vostre eccezioni e lascia passare quella del sistema di test
- funzioni ricorsive definite internamente ad un metodo o a una funzione
- il sistema di test individua solo metodi o funzioni ricorsive ESTERNE
- Sintomo: non passate i test di ricorsione anche se avete fatto la funzione ricorsiva
- Cura: spostate la funzione ricorsiva al livello esterno oppure fatene un metodo
- iterare su strutture dati mentre le si modifica
- quando iterate su una lista o un insieme o un dizionario e CONTEMPORANEAMENTE lo modificate, succede che il generatore dell'indice o dell'elemento
- Sintomo: alcuni degli elementi vengono saltati
- Cura: usate una copia della struttura per iterare, mentre invece modificate la struttura originale
- Altro metodo: scorrete la lista dalla fine verso l'inizio in modo che vi muoviate sempre VERSO LA PARTE NON ANCORA MODIFICATA della vostra lista
(va da sè che usare questi effetti collaterali o altre tecniche per fregare il sistema di calcolo dei tempi vi annulla il compito)