I'm trying to port a custom class from Python 2 to Python 3. I can't find the right syntax to port the iterator for the class. Here is a MVCE of the real class and my attempts to solve this so far:
Working Python 2 code:
class Temp: def __init__(self): self.d = dict() def __iter__(self): return self.d.iteritems() temp = Temp() for thing in temp: print(thing) In the above code iteritems() breaks in Python 3. According to this highly voted answer, "dict.items now does the thing dict.iteritems did in python 2". So I tried that next:
class Temp: def __init__(self): self.d = dict() def __iter__(self): return self.d.items() The above code yields "TypeError: iter() returned non-iterator of type 'dict_items'"
According to this answer, Python 3 requires iterable objects to provide a next() method in addition to the iter method. Well, a dictionary is also iterable, so in my use case I should be able to just pass dictionary's next and iter methods, right?
class Temp: def __init__(self): self.d = dict() def __iter__(self): return self.d.__iter__ def next(self): return self.d.next This time it's giving me "TypeError: iter() returned non-iterator of type 'method-wrapper'".
What am I missing here?