Bart Kastermans wrote:
I am playing with some trees. In one of the procedures I wrote for this I am trying to change self to a different tree. A tree here has four members (val/type/left/right). I found that self = SS does not work; I have to write self.val = SS.val and the same for the other members (as shown below). Is there a better way to do this? In the below self is part of a parse tree, F is the parse tree of a function f with argument x. If a node in the parse tree is labelled f, we should replace it by the parse tree for the function f, F, with the remainder of the tree substituted for the input variable for the function f, here x. def elimF (self): if self.val == "f": SS = F.copy () SS.subst ('x', self.left) self.val = SS.val # from here: set self to be SS self.type = SS.type self.left = SS.left self.right = SS.right # completed: set self to be SS
If you examine nodes from their parent, I believe you can do the substitution in one step. Something like:
for slot,child in ( ('left',self.left), ('right',self.right) ): if child is not None: if child.val == 'f': setattr(self, slot, F.copy().subst('x', child.left)) child.elimF where .subst returns the modified tree.
if self.left != None: # iterate onward, inf recursion if f # appears. Would need a check in # real version self.left.elimF () if self.right != None: self.right.elimF ()
Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list