How do I resolve this python error: "TypeError: 'NoneType' object is not iterable"?

Question:

How do I resolve this error?

Traceback (most recent call last):
You attacked Magus for 291 points of damage.
  File "/Users/bill/Documents/Dev/PycharmProjects/Battle/main.py", line 189, in <module>

spell, magic_dmg = enemy.choose_enemy_spell()

It’s only happening sometimes. I’m at a loss as to why it only happens sometimes and why only sometimes this data is “NoneType”.

for enemy in enemies:
    enemy_choice = random.randrange(0, 2)

    if enemy_choice == 0:
        target = random.randrange(0, 2)
        enemy_dmg = enemies[0].generate_damage()

        players[target].take_damage(enemy_dmg)
        print(enemy.name.replace("  ", "") + " attacks " + players[target].name.replace(" ", "") + " for", str(enemy_dmg) + ".")

    elif enemy_choice == 1:
        spell, magic_dmg = enemy.choose_enemy_spell()
        enemy.reduce_mp(spell.cost)

        if spell.type == "white":
            enemy.heal(magic_dmg)
            print(bcolors.OKBLUE + spell.name + " heals " + enemy.name.replace("  ", "") + " for", str(magic_dmg), "HP." + bcolors.ENDC)
        elif spell.type == "black":

            target = random.randrange(0, 2)

            players[target].take_damage(magic_dmg)

            print(bcolors.OKBLUE + "n" + enemy.name.replace(" ", "") + "'s " + spell.name + " deals", str(magic_dmg),
                  "points of damage to " + players[target].name.replace("  ", "") + bcolors.ENDC)

            if players[target].get_hp() == 0:
                print(players[target].name.replace("  ", "") + " has died.")
                del players[player]

Here is the complete code: https://pastebin.com/2tztP4P4

Asked By: user223417

||

Answers:

The error is in line 400. You are not returning anything there, which means you are returning None which cannot be unwrapped into spell, magic_dmg.

Answered By: Oersted

You need change the choose_enemy_spell function to return when you are calling it via recursion so the line

self.choose_enemy_spell()

changes to

return self.choose_enemy_spell()

Updated function is below

def choose_enemy_spell(self):
    magic_choice = random.randrange(0, len(self.magic))
    spell = self.magic[magic_choice]
    magic_dmg = spell.generate_damage()

    pct = self.hp / self.maxhp * 100

    if self.mp < spell.cost or spell.type == "white" and pct > 50:
        return self.choose_enemy_spell()
    else:
        return spell, magic_dmg
Answered By: Colwin