[Python-ideas] Introduce collections.Reiterable
Neil Girdhar
mistersheik at gmail.com
Sat Sep 21 08:56:29 CEST 2013
On Sat, Sep 21, 2013 at 2:25 AM, Stephen J. Turnbull <stephen at xemacs.org>wrote:
> Neil Girdhar writes:
>
> > You're right that you should go ahead and use something however you
> > want to. However, there are plenty of times where you can't do that,
> > e.g., you want to know if something is callable before calling it,
> > and similarly if something is reiterable before iterating it and
> > exhausting. That is the purpose of collections.abc,
>
> I don't think so. It's documented that way:
>
> This module provides abstract base classes that can be used to
> test whether a class provides a particular interface; for example,
> whether it is hashable or whether it is a mapping.
>
> But I wouldn't do explicit testing with isinstance, but rather use
> implicit assertions (at instantiation time) by deriving from the ABC.
> I don't see how Reiterable could be adapted to this style of
> programming because the API of iterables is basically fixed (support
> __iter__ or __getitem__).
>
Wouldn't you need to define a new ABC to do this?
Here's one possibility with Tim's iterable and not iterator:
class Reiterable(collections.Iterable,
metaclass=collections.abc.ABCMeta):
@classmethod
def __subclasshook__(cls, subclass):
if (collections.Iterable.__subclasshook__(subclass)
and not issubclass(subclass, collections.Iterator)):
return True
return NotImplemented
for obj in [list(), tuple(), dict(), set(), range(4),
(x * x for x in range(4))]:
print(type(obj),
isinstance(obj, Reiterable))
Another possibility would be to explicitly register Views and so on using
Reiterable.register(...)
>
> > and that's what I thought we were discussing.
>
> You were, I agree. But you proposed a new API, which pretty well
> guarantees many discussants will take a more global view, like "do the
> use cases justify this addition?"
>
It's a good point. I think if I'm the only with this problem, then the
answer is clearly no. I will just cast to list and so what if it's a
little bit slower in some cases. How could I know that I was the only one
with this problem?
> Another such question is "what exactly is the specification?" Tim
> Delany, for example, AIUI doesn't have a problem with saying that any
> iterable is reiterable, because it won't raise an exception if the
> program iterates it after exhaustion. It simply does nothing, but in
> some cases that's perfectly acceptable. I know you disagree, and I
> don't think that's a useful definition. Still it demonstrates the
> wide range of opinions on what "reiterable" can or should guarantee.
>
Yes, agreed that there are a wide range of reasonable opinions.
Best,
Neil
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20130921/b05a4f95/attachment-0001.html>
More information about the Python-ideas
mailing list