== Why is this an issue?

For-in loops, https://docs.python.org/3/whatsnew/3.3.html#pep-380-syntax-for-delegating-to-a-subgenerator[``++yield from++``] and iterable unpacking only work with https://docs.python.org/3/glossary.html#term-iterable[iterable objects]. In order to be iterable, an object should have either an ``++__iter__++`` method or a ``++__getitem__++`` method implementing the https://docs.python.org/3/glossary.html#term-sequence[Sequence] semantic.


Note also that iterating over an https://docs.python.org/3/glossary.html#term-asynchronous-iterable[asynchronous iterable], i.e. an object having the ``++__aiter__++`` method, requires the use of https://docs.python.org/3/reference/compound_stmts.html#the-async-for-statement[``++async for ... in++``] instead of ``++for ... in++``.


This rule raises an issue when a non iterable object is used in a ``++for-in++`` loop, in a ``++yield from++`` or when it is unpacked.

=== Noncompliant code example

[source,python]
----
class Empty:
    pass

empty = Empty()

for a in empty:  # Noncompliant
    print(a)

a, b, c = empty  # Noncompliant

print(*empty)  # Noncompliant

[1, 2, 3, *empty]  # Noncompliant

# yield from
def generator():
    yield from Empty()  # Noncompliant

# async generators
async def async_generator():
    yield 1

a, *rest = async_generator()  # Noncompliant
for a in async_generator():  # Noncompliant; "async" is missing before "for"
    print(a)
----

=== Compliant solution

[source,python]
----
class MyIterable:
    def __init__(self, values):
        self._values = values

    def __iter__(self):
        return iter(self._values)

my_iterable = MyIterable(range(10))

for a in my_iterable:
    print(a)

a, b, *c = my_iterable

print(*my_iterable)

[1, 2, 3, *my_iterable]

# yield from
def generator():
    yield from subgenerator()

def subgenerator():
    yield 1

# async generators
async def async_generator():
    yield 1

async for a in async_generator():
    print(a)
----

== Resources

* https://www.python.org/dev/peps/pep-0234/#python-api-specification[PEP 234 - Iterators]
* https://docs.python.org/3/library/stdtypes.html#iterator-types[Python documentation - Iterator Types]
ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::message.adoc[]

include::highlighting.adoc[]

endif::env-github,rspecator-view[]
