<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<link rel=
"STYLESHEET" href=
"lib.css" type='text/css'
/>
<link rel=
"SHORTCUT ICON" href=
"../icons/pyfav.png" type=
"image/png" />
<link rel='start' href='../index.html' title='Python Documentation Index'
/>
<link rel=
"first" href=
"lib.html" title='Python Library Reference'
/>
<link rel='contents' href='contents.html'
title=
"Contents" />
<link rel='index' href='genindex.html' title='Index'
/>
<link rel='last' href='about.html' title='About this document...'
/>
<link rel='help' href='about.html' title='About this document...'
/>
<link rel=
"next" href=
"node797.html" />
<link rel=
"prev" href=
"node792.html" />
<link rel=
"parent" href=
"compiler.html" />
<link rel=
"next" href=
"node797.html" />
<meta name='aesop' content='information'
/>
<title>19.4 Using Visitors to Walk ASTs
</title>
<div id='top-navigation-panel' xml:id='top-navigation-panel'
>
<table align=
"center" width=
"100%" cellpadding=
"0" cellspacing=
"2">
<td class='online-navigation'
><a rel=
"prev" title=
"19.3.3 Examples"
href=
"node795.html"><img src='../icons/previous.png'
border='
0' height='
32' alt='Previous Page' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"parent" title=
"19. Python compiler package"
href=
"compiler.html"><img src='../icons/up.png'
border='
0' height='
32' alt='Up One Level' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"next" title=
"19.5 Bytecode Generation"
href=
"node797.html"><img src='../icons/next.png'
border='
0' height='
32' alt='Next Page' width='
32'
/></A></td>
<td align=
"center" width=
"100%">Python Library Reference
</td>
<td class='online-navigation'
><a rel=
"contents" title=
"Table of Contents"
href=
"contents.html"><img src='../icons/contents.png'
border='
0' height='
32' alt='Contents' width='
32'
/></A></td>
<td class='online-navigation'
><a href=
"modindex.html" title=
"Module Index"><img src='../icons/modules.png'
border='
0' height='
32' alt='Module Index' width='
32'
/></a></td>
<td class='online-navigation'
><a rel=
"index" title=
"Index"
href=
"genindex.html"><img src='../icons/index.png'
border='
0' height='
32' alt='Index' width='
32'
/></A></td>
<div class='online-navigation'
>
<b class=
"navlabel">Previous:
</b>
<a class=
"sectref" rel=
"prev" href=
"node795.html">19.3.3 Examples
</A>
<b class=
"navlabel">Up:
</b>
<a class=
"sectref" rel=
"parent" href=
"compiler.html">19. Python compiler package
</A>
<b class=
"navlabel">Next:
</b>
<a class=
"sectref" rel=
"next" href=
"node797.html">19.5 Bytecode Generation
</A>
<!--End of Navigation Panel-->
<H1><A NAME=
"SECTION0021400000000000000000">
19.4 Using Visitors to Walk ASTs
</A>
<A NAME=
"module-compiler.visitor"></A>
The visitor pattern is ... The
<tt class=
"module"><a href=
"module-compiler.html">compiler
</a></tt> package uses a
variant on the visitor pattern that takes advantage of Python's
introspection features to eliminate the need for much of the visitor's
The classes being visited do not need to be programmed to accept
visitors. The visitor need only define visit methods for classes it
is specifically interested in; a default visit method can handle the
XXX The magic
<tt class=
"method">visit()
</tt> method for visitors.
<dl><dt><table cellpadding=
"0" cellspacing=
"0"><tr valign=
"baseline">
<td><nobr><b><tt id='l2h-
5032' xml:id='l2h-
5032'
class=
"function">walk
</tt></b>(
</nobr></td>
<td><var>tree, visitor
</var><big>[
</big><var>, verbose
</var><big>]
</big><var></var>)
</td></tr></table></dt>
<dl><dt><table cellpadding=
"0" cellspacing=
"0"><tr valign=
"baseline">
<td><nobr><b><span class=
"typelabel">class
</span> <tt id='l2h-
5033' xml:id='l2h-
5033'
class=
"class">ASTVisitor
</tt></b>(
</nobr></td>
<td><var></var>)
</td></tr></table></dt>
The
<tt class=
"class">ASTVisitor
</tt> is responsible for walking over the tree in the
correct order. A walk begins with a call to
<tt class=
"method">preorder()
</tt>. For
each node, it checks the
<var>visitor
</var> argument to
<tt class=
"method">preorder()
</tt>
for a method named `visitNodeType,' where NodeType is the name of the
node's class, e.g. for a
<tt class=
"class">While
</tt> node a
<tt class=
"method">visitWhile()
</tt>
would be called. If the method exists, it is called with the node as
The visitor method for a particular node type can control how child
nodes are visited during the walk. The
<tt class=
"class">ASTVisitor
</tt> modifies
the visitor argument by adding a visit method to the visitor; this
method can be used to visit a particular child node. If no visitor is
found for a particular node type, the
<tt class=
"method">default()
</tt> method is
<tt class=
"class">ASTVisitor
</tt> objects have the following methods:
XXX describe extra arguments
<dl><dt><table cellpadding=
"0" cellspacing=
"0"><tr valign=
"baseline">
<td><nobr><b><tt id='l2h-
5034' xml:id='l2h-
5034'
class=
"method">default
</tt></b>(
</nobr></td>
<td><var>node
</var><big>[
</big><var>, ...
</var><big>]
</big><var></var>)
</td></tr></table></dt>
<dl><dt><table cellpadding=
"0" cellspacing=
"0"><tr valign=
"baseline">
<td><nobr><b><tt id='l2h-
5035' xml:id='l2h-
5035'
class=
"method">dispatch
</tt></b>(
</nobr></td>
<td><var>node
</var><big>[
</big><var>, ...
</var><big>]
</big><var></var>)
</td></tr></table></dt>
<dl><dt><table cellpadding=
"0" cellspacing=
"0"><tr valign=
"baseline">
<td><nobr><b><tt id='l2h-
5036' xml:id='l2h-
5036'
class=
"method">preorder
</tt></b>(
</nobr></td>
<td><var>tree, visitor
</var>)
</td></tr></table></dt>
<div class='online-navigation'
>
<table align=
"center" width=
"100%" cellpadding=
"0" cellspacing=
"2">
<td class='online-navigation'
><a rel=
"prev" title=
"19.3.3 Examples"
href=
"node795.html"><img src='../icons/previous.png'
border='
0' height='
32' alt='Previous Page' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"parent" title=
"19. Python compiler package"
href=
"compiler.html"><img src='../icons/up.png'
border='
0' height='
32' alt='Up One Level' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"next" title=
"19.5 Bytecode Generation"
href=
"node797.html"><img src='../icons/next.png'
border='
0' height='
32' alt='Next Page' width='
32'
/></A></td>
<td align=
"center" width=
"100%">Python Library Reference
</td>
<td class='online-navigation'
><a rel=
"contents" title=
"Table of Contents"
href=
"contents.html"><img src='../icons/contents.png'
border='
0' height='
32' alt='Contents' width='
32'
/></A></td>
<td class='online-navigation'
><a href=
"modindex.html" title=
"Module Index"><img src='../icons/modules.png'
border='
0' height='
32' alt='Module Index' width='
32'
/></a></td>
<td class='online-navigation'
><a rel=
"index" title=
"Index"
href=
"genindex.html"><img src='../icons/index.png'
border='
0' height='
32' alt='Index' width='
32'
/></A></td>
<div class='online-navigation'
>
<b class=
"navlabel">Previous:
</b>
<a class=
"sectref" rel=
"prev" href=
"node795.html">19.3.3 Examples
</A>
<b class=
"navlabel">Up:
</b>
<a class=
"sectref" rel=
"parent" href=
"compiler.html">19. Python compiler package
</A>
<b class=
"navlabel">Next:
</b>
<a class=
"sectref" rel=
"next" href=
"node797.html">19.5 Bytecode Generation
</A>
<span class=
"release-info">Release
2.4.2, documentation updated on
28 September
2005.
</span>
<!--End of Navigation Panel-->
See
<i><a href=
"about.html">About this document...
</a></i> for information on suggesting changes.