[Python-Dev] Extending generic functions
Phillip J. Eby
pje at telecommunity.com
Wed Jan 16 00:40:00 CET 2008
At 02:19 PM 1/15/2008 -0800, Guido van Rossum wrote:
>While I have you, I've come across a need that I don't know how to do
>with GFs. Suppose I have a GF that implements some recursive function
>over container types, e.g. serialization or flattening. Now suppose
>I'd like to create *another* GF that implements the same algorithm
>except it does something different for one particular type; as a
>concrete example, suppose we want to treat tuples atomically when
>flattening. Is there a way to reuse the work of the first GF?
Yes. RuleDispatch actually has a 'clone()' feature for
single-dispatch generics that does exactly what you're looking for:
http://peak.telecommunity.com/DevCenter/VisitorRevisited
(see the heading "Extension and Reuse").
It's probably not a bad idea to put a cloning feature on my extended
to-do list for PEAK-Rules.
In PEAK-Rules (the system after which PEP 3124 was modelled), a
generic function has a RuleSet that contains its rules, and RuleSets
can be subscribed to. So, you could create a listener that
automatically takes the rules added to one function and adds them to others.
It's not packaged as a convenient decorator or anything, but one
certainly could make one. It'd also need to have some way to ensure
that the rules from the original function were treated at a lower
combination precedence than anything else, but that could be handled
by with a custom method type pretty easily, I think.
All in all, a cloning feature might be somewhere around 20-50 lines
of code to add in -- and a third party could probably roll their own
without changing PEAK-Rules' source.
> It doesn't work to create a new GF that calls on the first GF for types
>it doesn't understand; e.g. a list could contain a tuple. Does your GF
>machinery let me do this in a relatively clean way?
It's relatively clean. One of my goals for the changed architecture
in PEAK-Rules vs. RuleDispatch was to make it possible to do all
sorts of things like this, by opening up the whole thing to extensibility.
Btw, a lot of the credit for PEAK-Rules' design goes to you, in a
roundabout way. Your tuple-of-types prototype made me see that it
could be practical to implement generic functions using generic
functions as a base -- getting rid of interfaces and adaptation
altogether. I just needed to come up with a design that allowed
separating the genericness of a function (e.g. the rules to be
applied) from the implementation of genericness (the "engine" that
turns rules into executability.
In this way, a generic function can start out using just tuples of
types, but then graduate to a full expression-based system, just by
changing the engine.
More information about the Python-Dev
mailing list