[Python-Dev] PEP 246, redux

Phillip J. Eby pje at telecommunity.com
Thu Jan 13 16:08:10 CET 2005


At 11:31 AM 1/13/05 +0100, Alex Martelli wrote:

>On 2005 Jan 12, at 21:42, Phillip J. Eby wrote:
>    ...
>>Anyway, hopefully this post and the other one will be convincing that 
>>considering ambiguity to be an error *reinforces* the idea of I-to-I 
>>perfection, rather than undermining it.  (After all, if you've written a 
>>perfect one, and there's already one there, then either one of you is 
>>mistaken, or you are wasting your time writing one!)
>
>I'd just like to point out, as apparently conceded in your "fair enough" 
>sentence in another mail, that all of this talk of "wasting your time 
>writing" is completely unfounded.

The above refers to two I-to-I adapters between the same two points, not 
the addition of an adapter that creates an adaptation diamond.  I have 
indeed agreed that an "innocent" adapter diamond can trigger a "false 
alarm" from PyProtocols with respect to duplication.


>  Since that "fair enough" of yours was deeply buried somewhere inside 
> this huge conversation, some readers might miss the fact that your 
> numerous repetitions of the similar concept in different words are just 
> invalid, because, to recap:
>
>Given four interfaces A, B, C, D, there may be need of each of the single 
>steps A->B, A->C, B->D, C->D.  Writing each of these four adapters can IN 
>NO WAY be considered "wasting your time writing one", because there is no 
>way a set of just three out of the four can be used to produce the fourth one.

Right, I agreed to this.  However, the fact that a test can produce false 
positives does not in and of itself mean that it's "just invalid" -- the 
question is how often the result is *useful*.


>I seems to me that you do at least feel some unease at the whole 
>arrangement, given that you say "this whole debate has made me even less 
>enamored of adaptation", as

Not exactly, because my experience to date has been that false alarms are 
exceedingly rare and I have yet to experience a *useful* adapter diamond of 
the type you've described in an actual real-life interface, as opposed to a 
made up group of A,B,C,D.    So, my unease in relation to the adapter 
diamond issue is only that I can't say for absolutely certain that if PEP 
246 use became widespread, the problem of accidental I-to-I adapter 
diamonds might not become much more common than it is now.


>it's not clear to me that any _other_ aspect of "this whole debate" was 
>quite as problematic (e.g. issues such as "how to best get a special 
>method from class rather than instance" -- while needing to be resolved 
>for adaptation just as much as for copy.py etc -- hardly seem likely to 
>have been the ones prompting you to go looking for "a cleaner, more 
>intuitive way to do it" outside of the canonical, widespread approach to OOP).

No, the part that made me seek another solution is the reactions of people 
who were relatively fresh to the debate and the concepts of adaptation, 
interfaces, etc. in Python.  The fact that virtually every single one of 
them immediately reached for what developers who were more "seasoned" in 
this concept thought of as "adapter abuse", meant to me that:

1) Any solution that relied on people doing the right thing right out of 
the gate wasn't going to work

2) The true "Pythonic" solution would be one that requires the least 
learning of interfaces, covariance, contravariance, Liskov, all that other 
stuff

3) And to be Pythonic, it would have to provide only one "obvious way to do 
it", and that way should be in some sense the "right" way, making it at 
least a little harder to do something silly.

In other words, I concluded that we "seasoned" developers might be right 
about what adaptation is supposed to be, but that our mere presentation of 
the ideas wasn't going to sway real users.

So no, my goal wasn't to fix the adapter diamond problem per se, although I 
believe that the equivalent concept in duck adaptation (overlapping 
abstract methods) will *also* be able to trivially ignore adapter diamonds 
and still warn about meaningful ambiguities.

Instead, the goal was to make it so that people who try to abuse adapters 
will quickly discover that they *can't*, and second, as soon as they ask 
how, the obvious answer will be, "well, that's because you're doing a type 
conversion.  You need to create an instance of the thing you want, because 
you can't use that thing "as a" such-and-such."  And then they will go, 
"Ah, yes, I see...  that makes sense," and then go and sin no more.

With the previous PEP, people could create all sorts of subtle problems in 
their code (with or without transitivity!) and have no direct indicator of 
a problem.  Clark and Ian made me realize this with their string/file/path 
discussions -- *nobody* is safe from implicit adaptation if adaptation 
actually creates new objects with independent state!  An adapter's state 
needs to be kept with the original object, or not at all, and most of the 
time "not at all" is the correct answer.


>Anyway -- I'm pointing out that what to put in a rewrite of PEP 246 as a 
>result of all this is anything but obvious at this point, at least to me.

LOL.  Me either!



More information about the Python-Dev mailing list