我试着让它尽可能的简单。基本上,我希望将数据保存到一个文件中,并检索它,这样questor.py就可以工作,并可以“记住”它在你的机器上教过的所有东西。原始代码可以在http://www.strout.net/info/coding/python/questor.py上找到,如果我没看错代码,你会得到一个类似{key:{key:{key:class instance},class instance},class instance}的对象。(粗略估计)
请忽略unfished方法Save,一旦我弄清楚如何在不丢失任何嵌入实例的情况下筛选字典,我就会处理它。
以下是我试图通过pickler保存字典的尝试。有些代码尚未完成,但您应该能够了解我正在尝试做什么。到目前为止,我所能做的就是检索最后一个问题/答案集。要么是我的pickle没有保存嵌入的实例,要么是当我保存pickle时它们实际上不在那里。我已经尽可能地遵循了意大利面条的行,但似乎不知道如何设置一种保存到文件而不会丢失任何内容的方法。另外,我的文件不一定要是.txt,我原本打算用.data来处理这个问题。
# questor.py
# define some constants for future use
kQuestion = 'question'
kGuess = 'guess'
questfile = 'questfile.txt'
## Added
import cPickle as p
# create a file for questor
def questor_file():
try:
questor = open(questfile,'rb')
try:
q = p.Unpickler(questor)
quest = q.load()
questor.close()
return quest
except:
print 'P.load failed'
except:
print 'File did not open'
questor = open('questfile.data', 'wb')
questor.close()
return Qnode('python')
# 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
##Added
## Not sure where I found this, but was going to attempt to use this as a retreival method
## haven't gotten this to work yet
def Load(self):
f = open(self.questfile,'rb')
tmp_dict = cPickle.load(f)
f.close()
self.__dict__.update(tmp_dict)
##Added
# was going to use this as a save method, and call it each time I added a new question/answer
def Save(self,node):
f = open(self.questfile,'wb')
quest = p.pickler(f)
# 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}
self.save(self.nodes)
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
# This was supposed to assign the data from the file
topNode = questor_file()
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? ")
# Added
# give me the dictionary
return result
# immediate-mode commands, for drag-and-drop or execfile() execution
if __name__ == '__main__':
print "Let's play a game."
print 'Think of something, just one thing.'
print 'It can be anything, and I will try to guess what it is.'
raw_input('Press Enter when ready.')
print
questdata = run()
print
# Added
# Save the dictionary
questor = open(questfile,'wb')
q = p.Pickler(questor)
q.dump(questdata)
questor.close()
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发布于 2013-04-12 13:04:31
脑海中浮现的一种方法是创建所有节点的列表并保存该列表...他们应该把他们的内部指针放在自己身上。
在文件的顶部声明一个节点列表(并使用pickle...只是因为我对此更熟悉)
import pickle
kQuestion = 'question'
kGuess = 'guess'
questfile = 'questfile.txt'
nodes = []
....将load方法更改为类似于
def questor_file():
global nodes
try:
questor = open(questfile,'rb')
try:
nodes= pickle.load(questor)
quest = nodes[0]
questor.close()
return quest
except:
print 'P.load failed'
nodes = []
except:
print 'File did not open'
nodes = []
return Qnode('python')更改您的类构造函数,以便它将每个节点添加到节点
class Qnode:
# initialization method
def __init__(self,guess):
self.nodetype = kGuess
self.desc = guess
nodes.append(self)在结尾处显示# end save dictionary,保存您的节点列表
questor = open(questfile,'wb')
q = pickle.dump(nodes,questor)确保在出现提示时键入no退出程序...
您也可以将其保存到数据库或其他任何地方,但您仍然需要存储每个节点,而且可能会更加复杂……我认为这种方法应该很好(尽管可能有更自然的方法来保存树结构)……
https://stackoverflow.com/questions/15962727
复制相似问题