"""
This module creates Proxies that can also trap and delegate magic names.
Usage example:
>>> from proxy import *
>>> a = proxy([], ["__len__", "__iter__"])
>>> a
<proxy.listProxy object at 0x0113C370>
>>> a.__class__
<class 'proxy.listProxy'>
>>> a._obj
[]
>>> a.append
<built-in method append of list object at 0x010F1A10>
>>> a.__len__
<bound method listProxy.<lambda> of <proxy.listProxy object at 0x0113C370>>
>>> len(a)
0
>>> a.__getitem__
<method-wrapper object at 0x010F1AF0>
>>> a[1]
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
TypeError: unindexable object
>>> list(a)
[]
"""
class Proxy(object):
"""The Proxy base class."""
def __init__(self, obj):
"""The initializer."""
super(Proxy, self).__init__(obj)
#Set attribute.
self._obj = obj
def __getattr__(self, attrib):
return getattr(self._obj, attrib)
#Auxiliary getter function.
def getter(attrib):
return lambda self, *args, **kwargs: getattr(self._obj, attrib)(*args, **kwargs)
def proxy(obj, names):
"""Factory function for Proxies that can delegate magic names."""
#Build class.
cls = type("%sProxy" % obj.__class__.__name__,
(Proxy,),
{})
#Add magic names.
for name in names:
#Filter magic names.
if name.startswith("__") and name.endswith("__"):
if hasattr(obj.__class__, name):
#Set attribute.
setattr(cls, name, getter(name))
#Return instance.
return cls(obj)