我正在用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)。 有没有办法让它拉满整个生产线?

谢谢!

===============>>#1 票数:2 已采纳

由于堆栈是一个列表,并且您正在调用不带参数的pop方法,因此您将获得列表中的最后一个元素。 您可能想用空格分隔的字符串来转换列表,而不是:

def addQuestion(self):
    question = ' '.join(self.stack)
    answer = input(question)

观察到popjoin的副作用是不同的。 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!

===============>>#2 票数:1

您可以更改addQuestion以使用整个堆栈。

def addQuestion(self):
    question = ' '.join(self.stack) + '?'
    self.stack = []
    answer = raw_input(question)

我在input时遇到错误,因此将其更改为raw_input 我想这就是你想要的。

  ask by Zack Tanner translate from so

未解决问题?本站智能推荐:

关注微信公众号