Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

How do I save using pickle when dealing with questions and answers?

$
0
0
When run, this produces an error of "NameError: global name 'Qnode' is not defined. This only happened after I inserted the pickle code to save the file. Where is my problem with my pickle code?

import cPickle as p

questorfile = 'questorbrain.data'

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(questorfile)
storedlist = p.load(f)
print storedlist

# define some constants for future use

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


Viewing all articles
Browse latest Browse all 51036

Trending Articles