[Python-3000] Generic function PEP won't make it in time
Phillip J. Eby
pje at telecommunity.com
Mon Apr 23 21:28:14 CEST 2007
At 11:43 AM 4/23/2007 -0700, Guido van Rossum wrote:
>On 4/23/07, Phillip J. Eby <pje at telecommunity.com> wrote:
> > from overloading import overload, abstract
> >
> > def foo(bar, baz):
> > """Default implementation here"""
> >
> >
> > @overload
> > def foo(bar:int, baz:str):
> > """Overloaded implementation for int/str here"""
> >
> >
> > @abstract
> > def spam(fizz):
> > """This function has no default implementation, and raises
> > a "no applicable methods" error if called..."""
>
>(a) What's the point of having a separate keyword for this, as opposed
>to just raising an exception from the body?
EIBTI, mainly. Specifically, it's clear from the beginning that you're
looking at an empty function -- i.e., one that *can't* be called
successfully except for explicitly registered patterns -- versus one that
has a truly "generic" base implementation.
For example, a "pprint" generic function whose implementation falls back to
repr() is a bit different than say, a "get_stream()" function that can only
be called on path objects, stringIOs, files, and sockets. The latter has
no "generic" implementation.
Using the decorator also makes it easier to be consistent about what error
is raised -- @abstract is easier for me to remember than which exception to
raise. :)
I believe there was also another, somewhat more esoteric reason that gets
involved when you build more sophisticated rulesystems on top of the base
machinery, but the exact reason is escaping me at this moment. I remember
there being something that bothered me about your original Py3K overloading
prototype having to always use the original function body as the default
condition, but I don't remember specifically what, except that it was sort
of like doing math without being able to write "zero": you can work around
it, but it's kind of weird. :)
>(b) I'm proposing an @abstractmethod, which sets its argument's
>__isabstractmethod__ attribute and then returns it, otherwise
>unchanged. Would this be good enough for you, or do you need @abstract
>to do more? My point is, I could rename mine to @abstract so that it
>would serve your purpose as well -- but only if it would serve.
Assuming that:
1. If you call such a function, it will raise some error, like
NotImplementedError
2. It's a normal function object (i.e., can have its func_code repointed
later)
3. The __isabstractmethod__ can be set back to False once there is other
code registered
Then yes, it's perfect.
> > @overload
> > def spam(fizz:list):
> > """...unless an appropriate overload is added first"""
> >
> > Any questions? :)
>
>I'd like the examples even better if they used ABCs from PEP 3119. :-)
I'll keep that in mind for the actual PEP. :)
More information about the Python-3000
mailing list