[Python-Dev] PEP 246, redux
Clark C. Evans
cce at clarkevans.com
Thu Jan 13 18:46:43 CET 2005
On Wed, Jan 12, 2005 at 01:15:20PM -0800, Guido van Rossum wrote:
| [Clark]
| > - add a flag to adapt, allowTransitive, which defaults to False
|
| That wouldn't work very well when most adapt() calls are invoked
| implicitly through signature declarations (per my blog's proposal).
Understood. This was a side-suggestion -- not the main thrust of my
response. I'm writing to convince you that automatic "combined"
adaptation, even as a last resort, is a bad idea. It should be
manual, but we can provide easy mechanisms for application developers
to specify combined adapters easily.
On Wed, Jan 12, 2005 at 02:57:11PM -0500, Clark C. Evans wrote:
| On Wed, Jan 12, 2005 at 10:16:14AM -0800, Guido van Rossum wrote:
| | But now, since I am still in favor of automatic "combined" adaptation
| | *as a last resort*
A few problems with automatic "combined" adaptation:
1. Handling the case of multiple adaptation pathways is one issue;
how do you choose? There isn't a good cost algorithem since the
goodness of an adapter depends largely on the programmer's need.
2. Importing or commenting out the import of a module that may seem
to have little bearing on a given chunk of code could cause
subtle changes in behavior or adaptation errors, as a new path
becomes available, or a previously working path is disabled.
3. The technique causes people to want to say what is and isn't
an adapter -- when this choice should be soly up to the
appropriate developers. I'd rather not have to standardize
that FileName -> File is a _bad_ adaption, but File -> String
is a good adaption. Or whatever is in vogue that year.
4. It's overly complicated for what it does. I assert that this is
a very minor use case. When transitive adaptation is needed,
an explicit registration of an adapter can be made simple.
My current suggestion to make 'transitive adaption' easy for a
application builder (one putting togeher components) has a few
small parts:
- If an adaptation is not found, raise an error, but list in
the error message two additional things: (a) what possible
adaptation paths exist, and (b) how to register one of
these paths in their module.
- A simple method to register an adaption path, the error message
above can even give the exact line needed,
adapt.registerPath(from=A,to=C,via=B)
- Make it an error to register more than one adapter from A
to C, so that conflicts can be detected. Also, registrations
could be 'module specific', or local, so that adapters used
by a library need necessarly not be global.
In general, I think registries suffer all sorts of namespace and
scoping issues, which is why I had proposed __conform__ and __adapt__
Extending registry mechanism with automatic 'transitive' adapters
makes things even worse.
Cheers,
Clark
--
Clark C. Evans Prometheus Research, LLC.
http://www.prometheusresearch.com/
o office: +1.203.777.2550
~/ , mobile: +1.203.444.0557
//
(( Prometheus Research: Transforming Data Into Knowledge
\\ ,
\/ - Research Exchange Database
/\ - Survey & Assessment Technologies
` \ - Software Tools for Researchers
~ *
More information about the Python-Dev
mailing list