(original) (raw)



On Wed Mar 19 2014 at 2:46:48 PM, Antoine Pitrou <solipsis@pitrou.net> wrote:



Hello,



It is known to be cumbersome to write a proxy type that will correctly

proxy all special methods (this has to be done manually on the type,

since special methods are not looked up on the instance: a __getattr__

method would not work).



Recently we've had reports of two stdlib types that forgot to

implement some special methods:

- weakref.proxy doesn't implement __reversed__:

http://bugs.python.org/issue19359

- mock.MagicMock doesn't implement __truediv__:

http://bugs.python.org/issue20968



In http://bugs.python.org/issue19359#msg213530 I proposed to introduce a "proxy

protocol" (__proxy__ / tp_proxy) that would be used as a fallback by

_PyObject_LookupSpecial to fetch the lookup target, i.e.:



def _PyObject_LookupSpecial(obj, name):

tp = type(obj)

try:

return getattr(tp, name)

except AttributeError:

return getattr(tp.tp_proxy(), name)



What do you think?

Without having the code in front of me, would this only be for magic methods and attributes, or all attributes? IOW would this mean that if I assign an object to __proxy__ it would take care of the uses of __getattr__ for proxying?