FR Papi Jaaj
FR Papi Jaaj

Reputation: 3

Python 3.8.2| Why do I have a : TypeError: cannot unpack non-iterable NoneType object?

I'm a beginner in Python. Why do I have this error when I call this function? My function searchs the first technology (in dict_tech) which isn't already discovered (in dict_techdisc). Then, if you have the required amount of TECH Points, it calls a prompt which asks you if you want to discover the technology. If the answer is yes, it will substract the amount of TECH Points you have with the amount required, and update dict_techdisc with the same key of dict_tech. If it's no, it will stop the resquest.

dict_techdisc = {}
dict_tech = {"A":"Première lettre de l'Alphabet, Première des Voyelles.'a': Symbole de l'Are et de l'Attométrie.'A': Symbole de l'Ampère, Ancien Symbole de l'Argon.(Musique) 'A' La, dans le système de notation anglo-saxonne et germanique.'Å': Symbole de l'Angström.'À': Bombe Nucléaire de Fission."} 
dict_cout = {"A":6,"À(2)":11,"Abaca":1,"Abacule":1,"Abaisser (et ses dérivés)":13,"Abajoue":1,"Abandonner (et ses dérivés)":11,"Abaque":3,"Abasie":1}

def techachat(ptstech):
    """
Action servant à acheter une technologie pour un coût donné.
    """
    try:
        for tech, val in dict_cout.items():
            if tech in dict_cout.keys() and tech not in dict_tech.keys(): 
                if int(val) < ptstech:
                    res = 0
                    requete = ""
                    while requete != "oui" or requete != "non":
                        requete = input(f"Veux-tu acheter la technologie {tech}? (Oui, Non)")
                        if requete == "Oui":
                            ptstech -= int(val)
                            res = ptstech
                            for tech2 in dict_tech:
                                if dict_tech.get(tech2) is not None:
                                    dict_techdisc.update(dict_tech[tech2])
                                else:
                                    continue
                                break
                            time.sleep(3)
                            print(f"Vous avez bien débloqué la technologie {tech} pour un coût de {val} points TECH.")
                            time.sleep(3)
                            print(f"Il vous reste {ptstech} points TECH.")
                            time.sleep(3)
                            print("Fin de la requête")
                            print(dict_techdisc)
                            return res, dict_techdisc
                        elif requete == "Non":
                            print("Fin de la requête.")
                            return
                        else:
                            print("Réponse non valide!")
                            continue
                else:
                    print("Vous n'avez pas assez de points TECH pour pouvoir acheter la prochaine technologie!")
            else:
                continue
    except:
        print("Fin de la requête.")

Here is where I use it:

from Lanfangist import *

import time

from AvrupaBody import *

from Acte1 import *

from Sauvegarde import *

#-----Modules au dessus
#-----Code en dessous

#aventurech1()
dict_tech = {"A":"Première lettre de l'Alphabet, Première des Voyelles.'a': Symbole de l'Are et de l'Attométrie.'A': Symbole de l'Ampère, Ancien Symbole de l'Argon.(Musique) 'A' La, dans le système de notation anglo-saxonne et germanique.'Å': Symbole de l'Angström.'À': Bombe Nucléaire de Fission."} 
dict_cout = {"A":6,"À(2)":11,"Abaca":1,"Abacule":1,"Abaisser (et ses dérivés)":13,"Abajoue":1,"Abandonner (et ses dérivés)":11,"Abaque":3,"Abasie":1}

_ptstech = 50
_argent = 0
dict_techdisc = {}
_argent, dict_techdisc = techachat(_ptstech)
_ptstech = _argent
print(_ptstech)
print(dict_techdisc)
_argent, dict_techdisc = techachat(_ptstech)
_ptstech = _argent
print(_ptstech)
print(dict_techdisc)

And here is the error:

        _argent, dict_techdisc = techachat(_ptstech)
TypeError: cannot unpack non-iterable NoneType object

Upvotes: 0

Views: 2206

Answers (1)

Simon Martineau
Simon Martineau

Reputation: 210

If you write _argent, dict_techdisc = techachat(_ptstech), it means you expect your function to return a list or tuple of size 2. However, your function does not always return a two-element iterable. When it returns None, which happens when no return statements are encountered, an exception is raised. It's as if you were writing x, y = None. Consider surrounding the function call with a try block.

Upvotes: 1

Related Questions