[Python-Dev] PEP 246, redux

Phillip J. Eby pje at telecommunity.com
Wed Jan 12 20:39:09 CET 2005


At 09:46 AM 1/12/05 -0800, Michael Chermside wrote:
>This is a collection of responses to various things that don't appear
>to have been resolved yet:
>
>Phillip writes:
> > if a target protocol has optional aspects, then lossy adaptation to it is
> > okay by definition.  Conversely, if the aspect is *not* optional, then
> > lossy adaptation to it is not acceptable.  I don't think there can really
> > be a middle ground; you have to decide whether the information is required
> > or not.
>
>I disagree. To belabor Alex's example, suppose LotsOfInfo has first, middle,
>and last names; PersonName has first and last, and FullName has first,
>middle initial and last. FullName's __doc__ specifically states that if
>the middle name is not available or the individual does not have a middle
>name, then "None" is acceptable.

The error, IMO, is in registering an interface-to-interface adapter from 
PersonName to FullName; at best, it should be explicitly registered only 
for concrete classes that lack some way to provide a middle name.

If you don't want to lose data implicitly, don't register an implicit 
adaptation that loses data.


>You're probably going to say "okay, then register a LotsOfInfo->FullName
>converter", and I agree. But if no such converter is registered, I
>would rather have a TypeError then an automatic conversion which produces
>incorrect results.

Then don't register a data-losing adapter for implicit adaptation for any 
possible input source; only the specific input sources that you need it for.



> > it's difficult because intuitively an interface defines a *requirement*, so
> > it seems logical to inherit from an interface in order to add requirements!
>
>Yes... I would fall into this trap as well until I'd been burned a few times.

It's burned me more than just a few times, and I *still* sometimes make it 
if I'm not paying attention.  It's just too easy to make the mistake.  So, 
I'm actually open to considering dropping interface inheritance.

For adapters, I think it's much harder to make this mistake because you 
have more time to think about whether your adapter is universal or not, and 
you can always err on the safe side.  In truth, I believe I much more 
frequently implement class-to-interface adapters than 
interface-to-interface ones.  I can always go back later and declare the 
adapter as interface-to-interface if I want, so there's no harm in starting 
them out as class-to-interface adapters.


>Gee... I'm understanding the problem a little better, but elegant
>solutions are still escaping me.

My solution is to use class-to-interface adaptation for most adaptation, 
and interface-to-interface adaptation only when the adaptation can be 
considered "correct by definition".  It seems to work for me.



More information about the Python-Dev mailing list