<span class="gmail_quote"></span>Currently it's possible to customize attribute access via methods :<br><br>__getattribute__(self, name)<br>__getattr__(self, name)<br>__setattr__(self, name, value)<br><br><br>but it is not possible to customize local variable access. It would be useful for example to allow implementation of a local constant or any other on-access/on-modification behavior. The function should could be:
<br><br>__getlocal__(name)<br>__setlocal__(name, value)<br><br>By default they are just access to the local dictionnary for reading and writting (AFAIK the only current way to access this dictionnary is using the locals()  built-in).
<br>Here is a sample code of typical usage :<br><br>#######################<br>#Sample 1 : Tracing local access<br><br>old_getlocal = __getlocal__<br>old_setlocal = __setlocal__<br><br>#redefine the built-ins<br>def __getlocal__(name):
<br>    print 'accessing %s' % name<br>    return old_getlocal(name)<br><br>def __setlocal__(name, value):<br>    print 'setting %s with value %s' % (name, value)<br>    old_setlocal(name, value)<br><br>a = 1
<br>b = 2<br>c = 3<br><br>#setting b and accessing  a <br>b = a + 1<br><br>###################<br>#Sample 2 : Constants<br>old_getlocal = __getlocal__<br>
old_setlocal = __setlocal__<br>class ConstantError(Exception):pass<br>
constants = []<br><br>
#redefine the built-ins<br>
def __setlocal__(name, value):<br>
    if old_getlocal(name, value) in constants:<br>        raise ConstantError()<br>    else:<br>
        old_setlocal(name, value)<br><br>a = 1<br>b = 2<br>c = 3<br><br>constants = [b, c]<br><br>a = 4 #OK<br>b = 5 #IMPOSSIBLE<br><br>constant.remove(c)<br><br>c = 6 #OK<br><br><br>I found such approach more flexible than introducing a 'const' in python (not a good thing I think). And it enable many other customizations...
<br><br>Note : the fact that in my example I DO NOT access to any kind of writable local dictionary! This on purpose, the only way to access this dictionary should be : locals(), __getlocal__() and __setlocal__() built-ins.
<br><span class="sg"><br>Pierre-Yves Martin<br>pym<dot>aldebaran< a t >gmail<dot>com<br>
</span>