我正在开发Python中的迷你语言(不是真的,只是个人项目的一些命令)。
以下是代码:
class FlashCard:
def __init__(self):
self.commands = {'addQuestion':self.addQuestion}
self.stack = []
self.questions = {}
def addQuestion(self):
question = self.stack.pop()
answer = input(question)
def interpret(self,expression):
for token in expression.split():
if token in self.commands:
operator = self.commands[token]
operator()
else:
self.stack.append(token)
i = FlashCard()
i.interpret('testing this addQuestion')
解释函数只会从字符串中拉出最后一个字(this)。有没有办法让它拉出整条线?
谢谢!
答案 0 :(得分:2)
由于stack是一个列表,并且您正在调用不带参数的pop
方法,因此您将获得列表中的最后一个元素。您可能希望在空格分隔的字符串中转换列表,而不是:
def addQuestion(self):
question = ' '.join(self.stack)
answer = input(question)
观察pop
和join
的副作用是不同的。 pop
将修改原始列表:
>>> stack = ['testing', 'this']
>>> stack.pop()
'this'
>>> stack
['testing']
虽然join
不会:
>>> stack = ['testing', 'this']
>>> ' '.join(stack)
'testing this'
>>> stack
['testing', 'this']
编辑(参见下面OP的注释):要解析同一输入中的多个行/命令,您可以执行不同的操作。我想到的最容易的事情是:在调用operator()
之后刷新堆栈:
if token in self.commands:
operator = self.commands[token]
operator()
self.stack = []
编辑2(请参阅下面我自己的评论):以下是使用字符串列表的完整示例:
class FlashCard:
def __init__(self):
self.commands = {'addQuestion':self.addQuestion}
def addQuestion(self, phrase):
answer = raw_input(phrase)
def interpret(self, expressions):
for expression in expressions.split('\n'):
phrase, command = expression.rsplit(' ', 1)
if command in self.commands:
operator = self.commands[command]
operator(phrase)
else:
raise RuntimeError('Invalid command')
expressions = '''testing this addQuestion
testing that addQuestion
testing error removeQuestion'''
i = FlashCard()
i.interpret(expressions)
HTH!
答案 1 :(得分:1)
您可以更改addQuestion以使用整个堆栈。
def addQuestion(self):
question = ' '.join(self.stack) + '?'
self.stack = []
answer = raw_input(question)
我在input
收到错误,因此我将其更改为raw_input
。我想这就是你想要的。