Changing self: if self is a tree how to set to a different self

Terry Reedy tjreedy at
Thu Jul 10 14:29:32 EDT 2008

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))

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

More information about the Python-list mailing list