<!DOCTYPE html PUBLIC "-//IETF//DTD HTML//EN">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Program 3</title>
</head>
<body bgcolor="white">
<center>
<h1>Program 3</h1>
<h1>
Programs that Write Programs: pnamedtuple
</h1>
<p>
</p><h2>ICS-33: Intermediate Programming<br>
</h2>
<p>
</p></center>
<!-- Introduction -->
<a name="Introduction">
<hr align="left" width="33%">
<table rules="none" border="0" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr valign="top">
<td width="20%"><b>Introduction</b></td>
<td width="80%">
This programming assignment is designed to show how Python functions can define
other Python code (in this case, a class) in an unexpected way: the function
can build a huge string that represents the definition of a Python class and
then call <b>exec</b> on it, which causes Python to define that class just as
if it were written in a file and imported (in which case Python reads the
file as a big string and does the same thing).
Your code will heavily rely on string formatting operations: I suggest using
the <b>str.format</b> method to do the replacements: now is a good time to
learn about this function if you don't know already know it; but you are free
to use whatever string processing tool(s) you want.
<p>
I suggest that you first read the description below and define/test/debug as
much of the <b>Point</b> class as you can, writing it directly in Eclipse
(especially the<b>__getitem__</b>, <b>__eq__</b>, and <b>_replace__</b>
methods).
You might want to write a small batch file to help you test this class.
</p><p>
Once you have written/debugged the code for the <b>Point</b> class, define the
general <b>pnamedtuple</b> function, which when given the appropriate
arguments (for the <b>Point</b> class: <b>pnamedtuple('Point', 'x y')</b>)
constructs a huge string containing the same code as the <b>Point</b> class
you wrote.
Much of the code from your <b>Point</b> class will be turned into strings and
made generic: generalized for calls to <b>pnamedtuple</b> with different
arguments.
Use the <b>.format</b> method to replace the generic parts with the actual
strings needed for the class being defined.