[Docstring-checkins] CVS: dps/dps nodes.py,1.27,1.28
Status: Pre-Alpha
Brought to you by:
goodger
From: David G. <go...@us...> - 2002-02-13 02:26:57
|
Update of /cvsroot/docstring/dps/dps In directory usw-pr-cvs1:/tmp/cvs-serv18778/dps/dps Modified Files: nodes.py Log Message: - Added ``Node.walkabout()`` and "depart" methods to visitors. Index: nodes.py =================================================================== RCS file: /cvsroot/docstring/dps/dps/nodes.py,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** nodes.py 12 Feb 2002 02:21:18 -0000 1.27 --- nodes.py 13 Feb 2002 02:26:54 -0000 1.28 *************** *** 43,49 **** def walk(self, visitor): """ ! Traverse a tree of `Node` objects, calling ``visit_*`` methods of ! `visitor`. If there is no ``visit_particular_node`` method for a node ! of type ``particular_node``, the ``unknown_visit`` method is called. Doesn't handle arbitrary modification in-place during the traversal. --- 43,50 ---- def walk(self, visitor): """ ! Traverse a tree of `Node` objects, calling ``visit_...`` methods of ! `visitor` when entering each node. If there is no ! ``visit_particular_node`` method for a node of type ! ``particular_node``, the ``unknown_visit`` method is called. Doesn't handle arbitrary modification in-place during the traversal. *************** *** 60,63 **** --- 61,84 ---- children[i].walk(visitor) + def walkabout(self, visitor): + """ + Perform a tree traversal similarly to `Node.walk()`, except also call + ``depart_...`` methods before exiting each node. If there is no + ``depart_particular_node`` method for a node of type + ``particular_node``, the ``unknown_departure`` method is called. + + Parameter `visitor`: A `NodeVisitor` object, containing ``visit_...`` + and ``depart_...`` methods for each `Node` subclass encountered. + """ + method = getattr(visitor, 'visit_' + self.__class__.__name__, + visitor.unknown_visit) + method(self) + children = self.getchildren() + for i in range(len(children)): + children[i].walkabout(visitor) + method = getattr(visitor, 'depart_' + self.__class__.__name__, + visitor.unknown_departure) + method(self) + class Text(Node, MutableString): *************** *** 748,752 **** override individual methods for specific and useful behaviour. The "``visit_`` + node class name" method is called by `Node.walk()` upon ! entering a node. .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of --- 769,774 ---- override individual methods for specific and useful behaviour. The "``visit_`` + node class name" method is called by `Node.walk()` upon ! entering a node. `Node.walkabout()` also calls the "``depart_`` + node ! class name" method before exiting a node. .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of *************** *** 759,768 **** def unknown_visit(self, node): ! """Called for unknown `Node` types. Does nothing unless overridden.""" ! pass # Save typing with dynamic definitions. for name in node_class_names: exec """def visit_%s(self, node): pass\n""" % name del name --- 781,805 ---- def unknown_visit(self, node): ! """ ! Called when entering unknown `Node` types. ! ! Raise an exception unless overridden. ! """ ! raise NotImplementedError('visiting unknown node type: %s' ! % node.__class__.__name__) ! ! def unknown_departure(self, node): ! """ ! Called before exiting unknown `Node` types. ! ! Raise exception unless overridden. ! """ ! raise NotImplementedError('departing unknown node type: %s' ! % node.__class__.__name__) # Save typing with dynamic definitions. for name in node_class_names: exec """def visit_%s(self, node): pass\n""" % name + exec """def depart_%s(self, node): pass\n""" % name del name *************** *** 773,784 **** Generic "Visitor" abstract superclass, for simple traversals. ! Unless overridden, each ``visit_*`` method calls `default_visit()`. ! ``default_visit()`` must be overridden in subclasses. ! Define fully generic visitors by overriding ``default_visit()`` only. ! Define semi-generic visitors by overriding individual ``visit_*()`` ! methods also. ! `NodeVisitor.unknown_visit()` should be overridden for default behavior. """ --- 810,824 ---- Generic "Visitor" abstract superclass, for simple traversals. ! Unless overridden, each ``visit_...`` method calls `default_visit()`, and ! each ``depart_...`` method (when using `Node.walkabout()`) calls ! `default_departure()`. `default_visit()` (`default_departure()`) must be ! overridden in subclasses. ! Define fully generic visitors by overriding `default_visit()` ! (`default_departure()`) only. Define semi-generic visitors by overriding ! individual ``visit_...()`` (``depart_...()``) methods also. ! `NodeVisitor.unknown_visit()` (`NodeVisitor.unknown_departure()`) should ! be overridden for default behavior. """ *************** *** 787,793 **** --- 827,839 ---- raise NotImplementedError + def default_departure(self, node): + """Override for generic, uniform traversals.""" + raise NotImplementedError + # Save typing with dynamic definitions. for name in node_class_names: exec """def visit_%s(self, node): self.default_visit(node)\n""" % name + exec """def depart_%s(self, node): + self.default_departure(node)\n""" % name del name |