(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?