[Python-3000] Generic function PEP won't make it in time

Bill Janssen janssen at parc.com
Wed Apr 25 02:23:51 CEST 2007


> > Maybe "abstraction" is a better keyword than "abstract".
> >
> > Maybe it makes sense to have "abstraction" classes, and an
> > "@ignorethismethod" decorator to mark methods that are *not* part of
> > the abstraction, instead of "@abstractmethod" decorators to mark the
> > methods that *are* part of the abstraction.
> 
> class Iterator(Iterable):
>   @abstract
>   def __next__(self):
>     raise StopIteration
>   def __iter__(self):  # This is abstract in Iterable, but concrete here
>     return self
> 
> Both methods are part of the ABC. But only __next__ is abstract. Once
> could define a perfectly valid empty iterator like this:

If I'm following you correctly, you are saying that "Iterator" is an
abstraction class, but the only method which is part of the
abstraction is "__next__".

So it could be marked up as

@abstraction
class Iterator(Iterable):
  @abstractionmethod
  def __next__(self):
    raise StopIteration
  def __iter__(self):  # This is abstract in Iterable, but concrete here
    return self

or

@abstraction
class Iterator(Iterable):
  def __next__(self):
    raise StopIteration
  @ignorethismethod
  def __iter__(self):  # This is abstract in Iterable, but concrete here
    return self

"Iterator" inherits "__iter__" from "Iterable", so I think I prefer
the idea of explicitly marking the methods which form part of the
abstraction (the first form), because it gives you a chance to define
new methods with the same name:

@abstraction
class Iterator(Iterable):
  @abstractionmethod
  def __next__(self):
    raise StopIteration
  @abstractionmethod
  def __iter__(self, n):  # This is *not* the __iter__ from Iterable, but a new method
    return self * n

Bill


More information about the Python-3000 mailing list