2014-02-18 2 views
2

:혼란 나는 다음과 같은 코드에 대한 nosetest 쓰기를 시도하고 49

from nose.tools import * 
from ex49 import parser 

def test_parse_subject(): 
    word_list = [('verb', 'catch'), 
      ('noun', 'things')] 
    subj = ('noun', 'player') 
    verb = parser.parse_verb(word_list) 
    obj = parser.parse_object(word_list) 
    result = parser.Sentence(subj, verb, obj) 
    assert_equal(parser.parse_subject(word_list, subj), result) 

다음 parse_verb 방법을 말한다 나는이 시도하고 ParserError: Expected a verb, not None을 가지고

class ParserError(Exception): 
    pass 

class Sentence(object): 
    def __init__(self, subject, verb, object): 
     self.subject = subject[1] 
     self.verb = verb[1] 
     self.object = object[1] 

def peek(word_list): 
    if word_list: 
     word = word_list[0] 
     return word[0] 
    else: 
     return None 

def match(word_list, expecting): 
    if word_list: 
     word = word_list.pop(0) 

     if word[0] == expecting: 
      return word 
     else: 
      return None 
    else: 
     return None 

def skip(word_list, word_type): 
    while peek(word_list) == word_type: 
     match(word_list, word_type) 

def parse_verb(word_list): 
    skip(word_list, 'stop') 
    first = peek(word_list) 

    if first == 'verb': 
     return match(word_list, 'verb') 
    else: 
     raise ParserError("Expected a verb next, not %s." % first) 

def parse_object(word_list): 
    skip(word_list, 'stop') 
    next = peek(word_list) 

    if next == 'noun': 
     return match(word_list, 'noun') 
    if next == 'direction': 
     return match(word_list, 'direction') 
    else: 
     return ParserError("Expected a noun next.") 

def parse_subject(word_list, subj): 
    verb = parse_verb(word_list) 
    obj = parse_object(word_list) 

    return Sentence(subj, verb, obj) 

def parse_sentence(word_list): 
    skip(word_list, 'stop') 

    start = peek(word_list) 

    if start == 'noun': 
     subj = match(word_list, 'noun') 
     return parse_subject(word_list, subj) 
    elif start == 'verb': 
     return parse_subject(word_list, ('noun', 'player')) 
    else: 
     raise ParserError("Must start with subject, object or verb, not %s." % start) 

을, 어떤 아이디어? 나는 실패한 코드 이상을 게시 할 수 있었으면 좋겠지 만 지금은 총 8 시간 동안이 장과 어려움을 겪어 왔고 두뇌가 발사되었습니다.

+2

는 쉬었다. 멀리 걸어 다른 것을하고 다시 돌아와. – wheaties

답변

0

parse_verbword_list에서 동사를 제거합니다. parse_subject은 거기에서 동사를 찾으려고 시도하므로 예외가 발생합니다.

나는 운동이 코드가 무엇을하기로되어 있는지에 대한 어떠한 문서도 제시하지 않고 테스트를 작성하는 것을 바보스럽게 생각한다고 생각한다.

는이 같은 테스트를 작성할 수

def test_parse_subject(): 
    word_list = [('verb', 'catch'), 
      ('noun', 'things')] 
    subj = ('noun', 'player') 
    result = parser.Sentence('player', 'catch', 'things') 
    assert_equal(parser.parse_subject(word_list, subj), result) 

을 ...하지만 여전히 실패한다. Sentence__eq__ 메서드를 정의하지 않으므로 두 인스턴스는 ID로 비교됩니다.

대신을 시도해보십시오

def test_parse_subject(): 
    word_list = [('verb', 'catch'), 
      ('noun', 'things')] 
    subj = ('noun', 'player') 
    result = parser.parse_subject(word_list, subj) 
    assert_equal((result.subject, result.verb, result.object), 
       ('player', 'catch', 'things')) 
+0

좋아요, .pop() 함수가 주어진 튜플을 제거한다는 사실을 확실히 놓쳤습니다. 그러나, 나는 아직도이 프로그램이 어떻게 작동해야하는지에 대해 머리를 감쌀 수 없다. parse_verb가 튜플을 제거 할 때 생기는 장애물을 우회 할 수 없으므로 실패 할까? 가능성이 희박한 것 같습니다. – sivanes

관련 문제