Clueless with cPickle

les ordnancemarine at yahoo.com
Sun May 8 17:27:35 EDT 2005


I am working on a homework assignment and trying to use cPickle to store
the answers from questor.py I believe I have the syntax correct but am not
sure if I am placing everything where it needs to be.  Any help would be
greatly appreciated.  When I attempt to run what I have I end up with the
following:

Traceback (most recent call last):
  File "/home/les/workspace/Module 2/questor.py", line 18, in ?
    f = file(questorlistfile)
NameError: name 'questorlistfile' is not defined

I thought that I had defined questorlistfile on the 4th line below

# define some constants for future use 
 
import cPickle as p
#import pickle as p

questorfile = 'questor.data' # the name of the file where we will store the object

questorlist = []

# Write to the file
f = file(questorfile, 'w')
p.dump(questorlist, f) # dump the object to a file
f.close()

del questorlist # remove the shoplist

# Read back from the storage
f = file(questorlistfile)
storedlist = p.load(f)
print storedlist
 
kQuestion = 'question' 
kGuess = 'guess' 
 
# define a function for asking yes/no questions 
def yesno(prompt): 
    ans = raw_input(prompt) 
    return (ans[0]=='y' or ans[0]=='Y') 
 
# define a node in the question tree (either question or guess) 
class Qnode: 
 
    # initialization method 
    def __init__(self,guess): 
        self.nodetype = kGuess 
        self.desc = guess 
 
    # get the question to ask     
    def query(self): 
        if (self.nodetype == kQuestion): 
            return self.desc + " " 
        elif (self.nodetype == kGuess): 
            return "Is it a " + self.desc + "? " 
        else: 
            return "Error: invalid node type!" 
 
    # return new node, given a boolean response 
    def nextnode(self,answer): 
        return self.nodes[answer] 
 
    # turn a guess node into a question node and add new item 
    # give a question, the new item, and the answer for that item 
    def makeQuest( self, question, newitem, newanswer ): 
 
        # create new nodes for the new answer and old answer 
        newAnsNode = Qnode(newitem) 
        oldAnsNode = Qnode(self.desc) 
 
        # turn this node into a question node 
        self.nodetype = kQuestion 
        self.desc = question 
 
        # assign the yes and no nodes appropriately 
        self.nodes = {newanswer:newAnsNode, not newanswer:oldAnsNode} 
 
 
 
def traverse(fromNode): 
    # ask the question 
    yes = yesno( fromNode.query() ) 
 
    # if this is a guess node, then did we get it right? 
    if (fromNode.nodetype == kGuess): 
        if (yes): 
            print "I'm a genius!!!" 
            return 
        # if we didn't get it right, return the node 
        return fromNode 
 
    # if it's a question node, then ask another question 
    return traverse( fromNode.nextnode(yes) ) 
 
def run(): 
    # start with a single guess node 
    topNode = Qnode('python') 
 
    done = 0 
    while not done: 
        # ask questions till we get to the end 
        result = traverse( topNode ) 
 
        # if result is a node, we need to add a question 
        if (result): 
            item = raw_input("OK, what were you thinking of? ") 
            print "Enter a question that distinguishes a", 
            print item, "from a", result.desc + ":" 
            q = raw_input() 
            ans = yesno("What is the answer for " + item + "? ") 
            result.makeQuest( q, item, ans ) 
            print "Got it." 
 
        # repeat until done 
        print 
        done = not yesno("Do another? ") 
        print 
 
 
# immediate-mode commands, for drag-and-drop or execfile() execution 
if __name__ == '__main__': 
    run() 
    print 
    raw_input("press Return>") 
else: 
    print "Module questor imported." 
    print "To run, type: questor.run()" 
    print "To reload after changes to the source, type: reload(questor)" 
 
# end of questor.py 



More information about the Python-list mailing list