[Python-3000] Sane transitive adaptation
Phillip J. Eby
pje at telecommunity.com
Sat Apr 8 23:22:35 CEST 2006
At 01:39 PM 4/8/2006 -0700, Guido van Rossum wrote:
>On 4/7/06, Nick Coghlan <ncoghlan at gmail.com> wrote:
> > Mostly just the API docs:
> > http://peak.telecommunity.com/protocol_ref/module-protocols.html
>
>I just finally found this too. PJE's website is really a confusing
>maze; the only *source* for PyProtocols I've found so far is a CVS
>repository that seems to be telling me not to use it because it's been
>converted to SVN. But the SVN repository doesn't seem to have
>PyProtocols, only PEAK. :-(
>
>Anyway, the quote at the top of that page also explains why I'm still
>grappling for use cases:
Don't bother - PyProtocols has few use cases that aren't better served by
overloadable functions, even of the single-dispatch kind.
The use cases for overloadable functions, in turn, tend to break down into
single dispatch, double dispatch, and predicate dispatch. I haven't
actually encountered a use case for dispatching on 3 or more arguments that
didn't also require some other kind of predicate besides 'isinstance()'.
> I don't think of my own use of Python as that
>of "an integrator, someone who is connecting components from various
>vendors." Or at least, that's not what it feels like. I write plenty
>of code that uses multiple 3rd party libraries; for example my current
>Google project blends Django templates, wsgiref, a home-grown Perforce
>wrapper, a Google-internal database-ish API, and some other minor
>Google-specific APIs. But it doesn't *feel* to me like there's a need
>to adapt one package's API to that of another; instead, my application
>is in control and makes calls into each package as needed.
Those are mostly libraries, not frameworks, and for the most part you're
not *integrating* them. You're not trying to make Perforce store
information in your database, or to put a database API over Perforce, for
example.
> I wonder if
>it would feel different to you, Phillip and Alex, and I'm just not
>seeing the opportunities for adaptation, or if it really does depend
>on the typical application.
It depends mainly on the library. A lot of PEAK is there because existing
Python libraries or frameworks simply weren't extensible or configurable
enough for the tasks my team was doing at Verio. It was very, very
frustrating, because there were a lot of libraries that were almost perfect
- except for some dependency on an internal type that couldn't be mixed
with the types from some other library. Source patching or monkey patching
just didn't seem like a viable solution for a lot of these problems.
My later work on setuptools was inspired by realizing that the real answer
wasn't reinventing competing wheels, but rather to build more roads so that
more people would actually use the wheels and complain to the wheels'
makers if they weren't round enough. :)
>That's not the feeling that occurred to me when I was writing my
>Google project (see above). I can think of a few things that were
>inflexible. For example, the version of Django I'm using doesn't let
>you override how it searches for templates, and I had to monkey-patch
>the implementation to allow requesting the template source from an
>abstract API that gets it from a zip file, rather than going to the
>filesystem directly. But I don't see how adaptation or extensible
>functions would have helped.
Well, it would've given you a less obscure way of monkeypatching, since it
would be part of the language. And, the authors would be more likely to
think about "what functions might people want to overload?" and therefore
include choke points of this kind. If everything's overloadable, then
offering users choices is cheap.
Here's an example of a problem I ran into: pydoc and epydoc hate things
with custom metaclasses, callable objects not of FunctionType or
MethodType, and often any descriptor that wasn't a built-in type (like
classmethod, property, etc.). They both have big if-then trees dispatching
on type. So, I simply couldn't use them to generate documentation, even
though everything *else* about them was great, without extensive patching
(because the trees were spread out everywhere in their code bases).
If overloading was in the language, however, the One Obvious Way to
implement those libraries would've been overloading -- which means they
would have been extensible as a *natural side effect*.
So this is the way in which overloading will be *good* for the language,
because in this case, the right thing for the library user will become the
right thing for the library author as well.
More information about the Python-3000
mailing list