"""Check non-iterators returned by __iter__ """ # pylint: disable=too-few-public-methods, missing-docstring, no-self-use import six class FirstGoodIterator(object): """ yields in iterator. """ def __iter__(self): for index in range(10): yield index class SecondGoodIterator(object): """ __iter__ and next """ def __iter__(self): return self def __next__(self): """ Infinite iterator, but still an iterator """ return 1 def next(self): """Same as __next__, but for Python 2.""" return 1 class ThirdGoodIterator(object): """ Returns other iterator, not the current instance """ def __iter__(self): return SecondGoodIterator() class FourthGoodIterator(object): """ __iter__ returns iter(...) """ def __iter__(self): return iter(range(10)) class IteratorMetaclass(type): def __next__(cls): return 1 def next(cls): return 2 @six.add_metaclass(IteratorMetaclass) class IteratorClass(object): """Iterable through the metaclass.""" class FifthGoodIterator(object): """__iter__ returns a class which uses an iterator-metaclass.""" def __iter__(self): return IteratorClass class FileBasedIterator(object): def __init__(self, path): self.path = path self.file = None def __iter__(self): if self.file is not None: self.file.close() self.file = open(self.path) # self file has two infered values: None and # we don't want to emit error in this case return self.file class FirstBadIterator(object): """ __iter__ returns a list """ def __iter__(self): # [non-iterator-returned] return [] class SecondBadIterator(object): """ __iter__ without next """ def __iter__(self): # [non-iterator-returned] return self class ThirdBadIterator(object): """ __iter__ returns an instance of another non-iterator """ def __iter__(self): # [non-iterator-returned] return SecondBadIterator() class FourthBadIterator(object): """__iter__ returns a class.""" def __iter__(self): # [non-iterator-returned] return ThirdBadIterator