Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2021-22 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2021-22 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

VIDEOLEZIONI DEL CORSO DI FONDAMENTI DI PROGRAMMAZIONE AA20-21

PROGRAMMING COURSE VIDEOCONFERENCES AY20-21

TypeError: cannot unpack non-iterable NoneType object

The Electrician (800 points)
5 7 11
in HW6 obbligatorio by (800 points)
recategorized by

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?

901 views
closed

3 Answers

Best answer
andrea.sterbini (173640 points)
516 941 1795
by (174k points)
selected by
es1 riceve come argomento il nome del file, tu invece ti aspetti l'immagine già caricata
The Electrician (800 points)
5 7 11
by (800 points)

Grazie mille professore!
Svista mia laugh

Tommaso Sgroi (12990 points)
7 11 91
by (13.0k 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
by (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)
7 11 91
by (13.0k points)
È piuttosto curioso ciò che accade...
E
Edward (25950 points)
2 4 172
by (26.0k 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
by (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
by (26.0k 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
by (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
by (26.0k 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
by (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
by (26.0k 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
by (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
by (26.0k points)
Se non vedi i print, allora o non entra nella funzione, o la funzione viene interrotta prima del print.