[Python-Dev] Issue 643841: Including a new-style proxy base class in 2.6/3.0

Nick Coghlan ncoghlan at gmail.com
Tue May 27 14:56:51 CEST 2008


Armin Ronacher wrote:
> Hi,
> 
> Nick Coghlan <ncoghlan <at> gmail.com> writes:
> 
>> What version are you using, and are your proxies correctly implementing 
>> all the __r*__ versions of the methods?
> The link to the ugly proxy is in the mail :-)  And no, I'm currently not
> providing any __r*__ methods as I was too lazy to test on each call if the
> method that is proxied is providing an __rsomething__ or not, and if not come up
> with an ad-hoc implementation by calling __something__ and reversing the
> arguments passed.

I had another look - indeed, it is almost certainly the missing __r*__ 
methods which are causing problems for you when interacting with 
unproxied objects.

The other differences between what you're doing and the proposed 
typetools.ProxyMixin are that:
- ProxyMixin delegates the whole __getattribute__ operation to the 
target object so that descriptors work correctly (invoking 
object.__getattribute__ explicitly when it needs to retrieve the proxy 
object's _target attribute).
- ProxyMixin correctly delegates in-place assignment operations via the 
__i*__ methods (note however that using in-place assignment will remove 
the proxy wrapper, just as it does for weakref.proxy)
- ProxyMixin implicitly unwraps other ProxyMixin instances when it 
encounters them as an argument to an explicitly proxied operation
- ProxyMixin doesn't support deprecated operations like __getslice__ or 
__methods__


> 
>> While there are still some cases where types in the standard library 
>> raise TypeError directly instead of returning NotImplemented, they're 
>> generally pretty good about playing well with others (see the 
>> test_typetools.py file attached to the tracker item for #643841)
> I also think that the stdlib should mention NotImplemented with a big warning. 
> I see countless classes raising TypeError()s if __add__ or something fails which
> seem to work alright as long as someone tries to __radd__ it.

Returning NotImplemented is already mentioned in the documentation for 
the binary special methods, but I agree that it could be made more 
obvious that explicitly raising a TypeError from these methods is almost 
certainly the wrong thing to do.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-Dev mailing list