[Python-3000] PEP 3124 - Overloading, Generic Functions, Interfaces, etc.

Jim Jewett jimjjewett at gmail.com
Fri May 11 15:46:19 CEST 2007


On 5/10/07, Phillip J. Eby <pje at telecommunity.com> wrote:
> At 09:59 AM 5/11/2007 +1200, Greg Ewing wrote:
> >Phillip J. Eby wrote:
> >>As I said above (and in the PEP), *all* before and after methods
> >>are always called, unless an exception is raised somewhere along the way.

> >>   "Before" methods are invoked most-specific method first, with
> >>   ambiguous methods being executed in the order they were added.  All
> >>   "before" methods are called before any of the function's "primary"
> >>   methods (i.e. normal ``@overload`` methods) are executed.

As much as it seems clear once you understand ... it isn't, if only
because it is so unexpected.  I think it needs an example, such as

    class A: ...
    class B(A): ...

Then register before/after/around/normal methods for each, and show
the execution path for a B().  As I understand it now (without
rereading the PEP)

    AroundB part 1
    AroundA part 1
    BeforeA
    BeforeB
    NormalB
    # NormalA gets skipped, unless NormalB calls it explicitly
    AfterA
    AfterB
    AroundA part 2
    AroundB part 2

But maybe it would just be AroundB, because an Around is really a replacement?

> >I can see a problem with this. If Library1 defines a
> >method that always overrides an @around method, and
> >Library2 does the same thing, then if I try to use
> >both libraries at the same time, I'll get an exception
> >that I don't know the cause of and don't have any
> >idea how to fix.

> Actually, that would require that Library1 and Library2 both add
> methods to a generic function in Library3.  Not only that, but *those
> methods would have to apply to the same classes*.  So, it's actually
> a lot harder to create that situation than it sounds.

> In particular, notice that if Library1 only uses its combinators for
> methods applying to its own types, and Library2 does the same, they
> *cannot* create any method ambiguity in the third library's generic
> functions!

Library 1 and Library 2 both register Sage classes with Numpy, or vice
versa.  Library 1 and 2 don't know about each other.  Library 1 and 2
also go through some extra version skew pains when Sage starts
registering its types itself.

hmm... if Library 2 is slightly buggy, or makes a slightly different
mapping than library 1, then my getting correct results will depend on
which of Library 1/Library 2 gets imported first -- or, rather, first
got to the registration stage of their being imported.

-jJ


More information about the Python-3000 mailing list