Andrew Barnert via Python-ideas email@example.com writes:
On Sep 30, 2015, at 19:04, Akira Li firstname.lastname@example.org wrote:
Random832 email@example.com writes:
Akira Li firstname.lastname@example.org writes:
Andrew Barnert via Python-ideas email@example.com writes: ...
(The fact that we don't have a term for "non-iterator iterable", and
All iterators are iterable but some iterables are not iterators.
If your code accepts only iterators then use the term *iterator*. Otherwise the term *iterable* could be used.
It is misleading to use *iterable* if your code only accepts iterators.
If an iterable is an iterator; It is called *iterator*. The term *iterable* implies that some instances are not iterators.
There are three (well, three and a half) kinds of code that consume iterables, how would you describe each simply?
- Does not call iter, simply calls next. Therefore cannot consume a
- Calls iter, but can accept an iterator (e.g. only goes through it
- Cannot accept an iterator (goes through it twice, or permanently
stores a reference to it, etc)
*iterable* is an object that you can pass to iter() to get *iterator*. An iterable does not guarantee that it yields the same items twice.
And this is exactly the problem. We don't have any way to simply describe this thing. Hence all the confusion in this thread, and in similar discussions elsewhere, and even in the docs (e.g., describing dict views as sequences and then going on to explain that they're not actually sequences).
Use *iterable* instead of "non-iterator iterable" -- it is that simple.
"dict views" seems a pretty good term for dict views. Are you suggesting to call dict views "non-iterator iterable"? I don't see that it says more than that all dict views are iterable.
It seems there is a bug in the glossary: the entry name should be "dict views", not just "view" that is too generic for the description.
I've submitted a patch http://bugs.python.org/issue25286
The fact that it took your previous message four paragraphs without inventing a new term, to say what I said in one sentence with a new term, demonstrates the problem. As does the fact that my attempted new term, "non-iterator iterable", is sufficiently ugly and not intuitively helpful enough that you felt the need to expand on it for four paragraphs.
I don't need 4 paragraphs to describe it:
if you need an iterator; use the term *iterator* -- otherwise use *iterable* unless you need something more specific e.g., *seq* name is common for generic sequences
I don't remember ever using "non-iterator iterable". "non-iterator iterable" does not qualify as more specific. You need to introduce new requirements to the type for that.