Do you need any help?

[GUIDA] Errori difficili da individuare

andrea.sterbini (172780 points)
514 935 1789
asked Nov 29, 2020 in Programmare in Python by andrea.sterbini (172,780 points)
edited Jan 11, 2021 by andrea.sterbini

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)

2 Answers

O
Oakandrew (6400 points)
4 26 63
answered Nov 29, 2020 by Oakandrew (6,400 points)
Salve,

ci ho provato di fare hw6 obb con la ricorsione, mi restituiva "max depth recursion" in test piu grandi(facevo ricerca delle immagini che stanno sopra), invece passava in test piu piccoli, su vm risultava "errore interno" e quantita di test passati uguale a 0
andrea.sterbini (172780 points)
514 935 1789
commented Nov 29, 2020 by andrea.sterbini (172,780 points)
Infatti. Se viene INTERNALERROR vuol dire che con lo stack esaurito il sistema pytest è andato in crash. (lo aggiungo sopra)
O
Oakandrew (6400 points)
4 26 63
commented Nov 29, 2020 by Oakandrew (6,400 points)
si, ma volevo notare(probabilmente non riesco ricevere in prossimo hw 16 punti obbligatori per ammissione all'esame) che dopo aver spedito il programma su vm, la quantita dei test passati(in q2a) uguale a 0,ma in mio Anaconda Prompt risultavano 6 test passati. A questo punto il voto sarebbe uguale a 18 invece di 0 senza test segreti. E siccome non potevo importare librerie, non sarei riuscito aumentare lo stack
andrea.sterbini (172780 points)
514 935 1789
commented Nov 30, 2020 by andrea.sterbini (172,780 points)
Giusto, questi casi particolari li dovrò individuare a mano per aggiornare le tabelle dei risultati definitive dopo i test segreti
andrea.sterbini (172780 points)
514 935 1789
commented Nov 30, 2020 by andrea.sterbini (172,780 points)
Va da sè che nel log dev'esserci almeno qualche test superato ....
O
Oakandrew (6400 points)
4 26 63
commented Nov 30, 2020 by Oakandrew (6,400 points)
edited Nov 30, 2020 by Oakandrew
grazie, penso di si, non mi ricordo precisamente,

se non sbaglio in menu "CORRETTEZZA" alcuni test risultavano "PASSED". Ma la quantita di test passati su q2a(non di voce "correttezza") era stato 0(in questo sono sicuro)
andrea.sterbini (172780 points)
514 935 1789
commented Nov 30, 2020 by andrea.sterbini (172,780 points)
Però con i test segreti mi sa che saresti stato insufficiente perchè l'errore stoppa la loro esecuzione la percentuale rispetto a più test scende
O
Oakandrew (6400 points)
4 26 63
commented Dec 1, 2020 by Oakandrew (6,400 points)
edited Dec 1, 2020 by Oakandrew
Non Le so dire, ma in questo caso Lei potrebbe ordinare @data in test01.py in base di tempo di esecuzione compreso i test segreti. E a sto punto il voto dipende da pesantezza dei test segreti
andrea.sterbini (172780 points)
514 935 1789
commented Dec 3, 2020 by andrea.sterbini (172,780 points)
Se succede ci provo
sinisimattia (840 points)
0 3 8
answered Dec 17, 2020 by sinisimattia (840 points)
Salve, nell'homework 8 ho definito la mia funzione ricorsiva come funzione esterna, tuttavia il test non riesce comunque a trovare l'eccezione.

Nessuna di queste regole si applica al mio caso (credo). In ogni caso ora lo consegno, potrebbe dirmi come mai il test non trova la ricursione?
andrea.sterbini (172780 points)
514 935 1789
commented Dec 17, 2020 by andrea.sterbini (172,780 points)
edited Dec 17, 2020 by andrea.sterbini
Il codice che hai consegnato non riesce a riconoscere le istruzioni lette dal file e lancia una eccezione che hai definito tu