77See its documentation for more information.
88'''
99
10+ import re
1011
1112class ProxyProperty (object ):
1213 '''
@@ -56,32 +57,31 @@ def __init__(self, attribute_name, doc=None):
5657 raise Exception ("The `attribute_name` must start with a dot to "
5758 "make it clear it's an attribute. %s does not "
5859 "start with a dot." % repr (attribute_name ))
60+ self .getter = self .setter = None
61+ exec ('def getter(thing): return thing%s' % attribute_name )
62+ exec ('def setter(thing, value): thing%s = value' % attribute_name )
63+ exec ('self.getter, self.setter = getter, setter' )
5964 self .attribute_name = attribute_name [1 :]
6065 self .__doc__ = doc
6166
6267
63- def __get__ (self , obj , our_type = None ):
64- if obj is None :
68+ def __get__ (self , thing , our_type = None ):
69+ if thing is None :
6570 # We're being accessed from the class itself, not from an object
6671 return self
6772 else :
68- if '.' in self .attribute_name :
69- from python_toolbox import address_tools
70- return address_tools .resolve ('obj.%s' % self .attribute_name ,
71- namespace = {'obj' : obj })
72- else :
73- return getattr (obj , self .attribute_name )
73+ return self .getter (thing )
7474
75- def __set__ (self , obj , value ):
76-
77- # todo: should I check if `obj` is `None` and set on class? Same for
75+ def __set__ (self , thing , value ):
76+ # todo: should I check if `thing` is `None` and set on class? Same for
7877 # `__delete__`?
7978
80- if '.' in self .attribute_name :
81- from python_toolbox import address_tools
82- left_segment , right_segment = self .attribute_name .rsplit ('.' , 1 )
83- deepest_object = address_tools .resolve ('obj.%s' % left_segment ,
84- namespace = {'obj' : obj })
85- setattr (deepest_object , right_segment , value )
86- else :
87- setattr (obj , self .attribute_name , value )
79+ return self .setter (thing , value )
80+
81+ def __repr__ (self ):
82+ return '<%s: %s%s>' % (
83+ type (self ).__name__ ,
84+ repr ('.%s' % self .attribute_name ),
85+ ', doc=%s' % repr (self .__doc__ ) if self .__doc__ else ''
86+ )
87+
0 commit comments