Operating Ubunutu Linux 5.04 on iMac 333mhz
Python 2.4.1 in IDLE 1.1.1

In trying to create a interactive drawing framework in Python I came across
the idea of binding attributes of one object to attributes of another.

The way it works is when obj1.attr1 is set obj2.attr2 should have it's
__setattr__ method called as well. But it ends up giving me a recursion error.

The attribute synchronization is shown below:

#file: sync.py

def sync(attr1,obj1,obj2,attr2=None):
   """Synchronize attribute access

   attr1:
   name of attribute to synchronize
   attr2:
   (optional) attribute name to use when setting second object.
"""
       if not attr2: attr2 = attr1
       # rename old __setattr__'s
       try:
           obj1.__old_setattr__ = obj1.__setattr__
           obj2.__old_setattr__ = obj2.__setattr__
       except AttributeError: pass
       # modify mirrored attributes on attribute change
       def hook_setattr(inst):
       # Hey! Only classes have special methods!
           class sethook(inst.__class__):
               def __setattr__(self,name,value):
                       try:
                           self.__old_setattr__(name,value)
                       except AttributeError: pass
                       if name in self.__syncdict__:
                           entry = self.__syncdict__[name]
                           for mirror,attr in entry: pass
# recursion error here:       setattr(mirror,attr,value)
           #sethook.__name__ = inst.__class__.__name__ # magic?
           inst.__class__ = sethook
       # append synchronization info
   try:
       obj1.__syncdict__[attr1].append(obj2,attr2)
   except AttributeError:
       obj1.__syncdict__ = {attr1: [(obj2,attr2)]}
   try:
       obj2.__syncdict__[attr2].append(obj1,attr1)
   except AttributeError:
       obj2.__syncdict__ = {attr2: [(obj1,attr1)]}
       # make the magic work
       hook_setattr(obj1)
       hook_setattr(obj2)

When I try to call this like sync('attr',obj,obj2) I get a recursion error.
I could understand this happening if I was calling setattr on itself, but
why the other object?

Any help is greatly appreciated. Also, any pointers on efficiency or easier
ways is also welcome. Thanks in
advance.

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to