TypeError: cannot unpack non-iterable NoneType object

The Electrician (800 points)
5 7 11
asked Nov 29, 2019 in HW6 obbligatorio by The Electrician (800 points)
recategorized Nov 30, 2019 by The Electrician

Buonasera,

ho eseguito il mio programma da console di Spyder e ho ottenuto i risultati corretti per tutte le immagini dei test. Tuttavia, quando vado ad eseguire i test su Anaconda Prompt, mi compare il seguente messaggio di errore:

TypeError: cannot unpack non-iterable NoneType object

Il messaggio compare appena il test legge la riga dove metto i valori di una tupla in due variabili, con la normale procedura di unpacking largamente supportata da Python.

In che modo posso correggere quest'errore?

890 views

3 Answers

Best answer
andrea.sterbini (172780 points)
513 935 1789
answered Nov 30, 2019 by andrea.sterbini (172,780 points)
selected Nov 30, 2019 by The Electrician
es1 riceve come argomento il nome del file, tu invece ti aspetti l'immagine già caricata
The Electrician (800 points)
5 7 11
commented Nov 30, 2019 by The Electrician (800 points)

Grazie mille professore!
Svista mia laugh

Tommaso Sgroi (12990 points)
6 11 91
answered Nov 29, 2019 by Tommaso Sgroi (12,990 points)
Prova a fare un update delle librerie, sennò assicurati di aver salvato il programma prima di lanciarlo di nuovo... Alle brutte prova a riavviare.
Lo so che sono consigli un po' banali ma per ora è il massimo che posso consigliarti.
The Electrician (800 points)
5 7 11
commented Nov 29, 2019 by The Electrician (800 points)
Ogni consiglio è ben accetto!

Escludo a priori la dimenticanza di un salvataggio per un fattore di abitudine. Ho provato invece ad aggiornare le librerie ma, come mi aspettavo, l'errore non è stato corretto.

Ho provato anche a consegnare il programma per vedere i risultati dalla VM e anche lì compare lo stesso errore a tutti i test.
Ma come può una variabile essere corretta sulla console di Spyder e None sul resto?
Tommaso Sgroi (12990 points)
6 11 91
commented Nov 30, 2019 by Tommaso Sgroi (12,990 points)
È piuttosto curioso ciò che accade...
E
Edward (25950 points)
2 4 172
answered Nov 29, 2019 by Edward (25,950 points)

dove metto i valori di una tupla in due variabili

La variabile della quale cerchi di fare l'unpacking, in realtà non è una tupla, ma ha valore None.

Devi controllare come mai assume come valore None e non il valore da te immaginato.

The Electrician (800 points)
5 7 11
commented Nov 29, 2019 by The Electrician (800 points)
Questo mi è chiaro, ma se i valori fossero davvero None, allora mi sarei aspettato lo stesso errore anche in console di Spyder, invece lì ottengo i risultati dei test corretti.

In altre parole, se ci fosse un errore di valore all'interno di quelle variabili, non dovrebbe fermarmi il programma quando lo eseguo anche da Spyder?
E
Edward (25950 points)
2 4 172
commented Nov 29, 2019 by Edward (25,950 points)
Evidentemente su spyder fai qualcosa di diverso, altrimenti è impossibile che ti da quell'errore.

Stai parlando di un homework? (hai postato nella sezione avvisi)
Se il tuo problema è su un homework, e non hai già consegnato, ti consiglio di farlo così puoi vedere se sulla VM da lo stesso errore.
Senza vedere il codice è difficile fare debug su queste cose, consegnandolo il prof può vedere il codice e dirti dov'è il problema.

Edit: poi su spyder hai testato tutti i test con spyder-unittest oppure solamente uno a mano?
The Electrician (800 points)
5 7 11
commented Nov 30, 2019 by The Electrician (800 points)
Hai ragione, grazie mille di avermelo fatto notare. Ho spostato il topic nella sezione homework.

Allora, il codice lo avevo consegnato proprio per vedere se sulla VM la situazione variava e invece ho ritrovato lo stesso errore.
Su Spyder, invece, l'ho fatto a mano. Ho creato delle variabili per caricare tutte le immagini che ci sono nella cartella dei test e, per ognuna, l'ho passata alla funzione principale con il valore k che il test richiedeva, stampandomi il risultato.
Non solo i risultati ottenuti sono giusti, ma prima di eseguire i test stampo sempre le variabili per vedere se vengono lette correttamente e all'interno di quelle che devono contenere i valori delle tuple c'è qualcosa, non sono a None, per quello non capisco proprio da cosa possa dipendere l'errore.
E
Edward (25950 points)
2 4 172
commented Nov 30, 2019 by Edward (25,950 points)
Se vai su test_01.py e commenti la riga 11 (in questo modo DEBUG avrà il valore True) ti disabilita il timeout e ti abilita i print quando chiami la funzione di test.
In questo modo se fai un print(tupla) prima dell'unpack di essa dovresti vedere che ha come valore None.
Devi cercare di capire come mai assume quel valore, i test non sbagliano quindi probabilmente tu fai qualcosa di diverso quando chiami manualmente la funzione da IPython
The Electrician (800 points)
5 7 11
commented Nov 30, 2019 by The Electrician (800 points)
I test sicuramente non sbagliano, la cosa curiosa è che il programma viene bene su console, lo salvo, lo faccio eseguire sul prompt e mi va in errore... ma il programma è lo stesso.

Ora sto provando a farmi stampare il valore. Quella tupla la faccio tornare da una funzione esterna. Se stampo una variabile che contiene il risultato della funzione, logicamente mi da None, ma questo lo avevamo capito dal messaggio d'errore. Quindi ho provato a stamparmi i dati da dentro la funzione esterna ma non riesco a vederli da Prompt.
Commentando quella riga posso visualizzare solo le stampe nella funzione principale?
E
Edward (25950 points)
2 4 172
commented Nov 30, 2019 by Edward (25,950 points)
Teoricamente commentando quella riga il print non viene disabilitato, quindi tutti i print vengono stampati

Evidentemente la funzione esterna restituisce None in qualche modo
The Electrician (800 points)
5 7 11
commented Nov 30, 2019 by The Electrician (800 points)
Quindi dovrei riuscire a vedere le stampe...
E' bello quando le cose funzionano a dovere. xD

Niente, dovrò fare solo esperimenti allora, grazie mille per la pazienza e per i consigli. :)
E
Edward (25950 points)
2 4 172
commented Nov 30, 2019 by Edward (25,950 points)
Se non vedi i print, allora o non entra nella funzione, o la funzione viene interrotta prima del print.