2011-12-11 4 views
0

저는 파이썬으로 미니 언어를 개발하고 있습니다. (개인 프로젝트를위한 몇 가지 명령이 아닙니다.)스택에 공백이있는 문자열 추가

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

해석] 함수는 문자열에서 마지막 단어 (이)를 끌어 :

여기에 코드입니다. 전체 라인을 당기는 방법이 있습니까?

감사합니다.

+1

들어오는 답변에서 내가 원하는 결과에 혼란스러워합니다. 해석을 위해 전달 된 전체 표현식이나 명령 토큰이 아닌 토큰 만 유지하려고합니까? 또한, 명령 토큰이 표현식의 중간에 발견되면, 호출 된 후 이전에 캡처 된 토큰에만 작용합니다. 그게 네가 원하는거야? – jdi

+1

@jdi - OP 만 확실히 알고 있지만 코드에서 '고양이의 터키어 번역이란 무엇입니까?'와 같은 사용자 지정 명령에 대한 파서를 작성하고있을 것으로 예상됩니다. addQuestion' [아마도 "고양이"의 터키어 번역은 무엇입니까? "라는 질문에 새 플래시 카드를 추가해야 할 것입니다." 나는 틀릴지도 모른다! :) – mac

+0

당신이 맞습니다, 맥. 각 문제는 그 자체로 서 있어야하며, 새로운 해석 라인은 오래된 질문과 결합되어서는 안됩니다. –

답변

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!

+0

너 락! 감사. :) –

+0

문제는 일치하는 명령 토큰을 추가하지 않을 것이기 때문에 여전히 전체 라인이되지는 않을 것이라는 점입니다. 명령과 일치하지 않는 유일한 추가 단어. 모든 토큰을 추가하려고하는 것처럼 보입니다. 명령 토큰을 캡처하고 마지막에 호출합니다. – jdi

+0

@jdi - OP가 원하는 작업을 이해하면 올바른 동작이되어야하지만 잘못 생각해! :) – mac

1

전체 스택을 사용하도록 addQuestion을 변경할 수 있습니다.

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

내가 input와 오류를 얻고 있었다 그래서 나는 그에게 raw_input을 변경했습니다. 나는 그것이 당신이 원하는 것이라고 생각합니다.

+0

굉장합니다. 그게 효과가 있었어. 고맙습니다! –

관련 문제