diff options
Diffstat (limited to 'tests/functional/n/non/non_iterator_returned.py')
-rw-r--r-- | tests/functional/n/non/non_iterator_returned.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/tests/functional/n/non/non_iterator_returned.py b/tests/functional/n/non/non_iterator_returned.py new file mode 100644 index 000000000..4d0dd2a39 --- /dev/null +++ b/tests/functional/n/non/non_iterator_returned.py @@ -0,0 +1,101 @@ +"""Check non-iterators returned by __iter__ """ + +# pylint: disable=too-few-public-methods, missing-docstring, no-self-use, useless-object-inheritance, consider-using-with + + +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 + + +class IteratorClass(object, metaclass=IteratorMetaclass): + """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, encoding="utf-8") + # self file has two infered values: None and <instance of 'file'> + # 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 |