2XK_
2XK_

Reputation: 19

iter() returned non-iterator of type 'int'

I've been trying to make a text RPG and started to work on an inventory system.

This is my code:

class items(object):
    def __init__(self, name, value, quantity=1):
        self.name=name
        self.raw=name.strip().lower()
        self.quantity=quantity

        self.value=value
        self.net_value=quantity*value

    def recalculate(self):
        self.net_value=self.quantity*self.value

class Container(object):
    def __init__(self, name, max_space):
        self.name=name
        self.inside={}
        self.max_space=max_space

    def __iter__(self):
        return len(self.inside.items())

    def __len__(self):
        return len(self.inside)

    def __contains__(self, item):
        return item.raw in self.inside

    def __getitem__(self, item):
        return self.inside[item.raw]

    def __setitem__(self, item, value):
        self.inside[item.raw]=value
        return self[item]

    def add(self, item, quantity=1):
        if quantity<0:
            raise ValueError('Negative quantity. Use remove() instead.')
        if item in self:
            self[item].quantity+=quantity
            self[item].recalculate()
        else:
            self[item]=item

    def remove(self, item, quantity=1):
        if item not in self:
            raise KeyError('Item not in container')
        if quantity<0:
            raise ValueError('Negative quantity. Use add() instead.')

        if self[item].quantity<=quantity:
            del self.inside[item.raw]
        else:
            self[item].quantity-=quantity
            self[item].recalc()

    backpack=Container('Backpack', 15)
    sword=items('Sword', 10)
    gold=items('Gold Coin', 1, 50)
    potion=items('Potion', 5)
    backpack.add(sword)
    backpack.add(gold)
    for name, item in backpack:
        print(item.name, item.quantity)

It gives me this error:

Traceback (most recent call last):
File "F:/2XK_/Coding/Python/Python_Battle/Maybe usefull/inv_2.py", line 72, in <module>
for name, items in backpack:
TypeError: iter() returned non-iterator of type 'int'

The problem is in this line for name, item in backpack: (obviously).

What i want it to print is this:

Gold Coin 50
Sword 1

So how can I resolve this problem? Any help would be appreciated.

Upvotes: 0

Views: 1109

Answers (1)

Xarencia
Xarencia

Reputation: 26

Your redefinition of "iter" is wrong, something like this should do the trick:

    def __iter__(self):
        yield from self.inside.items()

Upvotes: 1

Related Questions