2013-12-23 95 views
1

我正在努力通过学习Python的难方式练习49(http://learnpythonthehardway.org/book/ex49.html),我需要比较两个不同的对象。这是我需要的测试代码:比较对象与鼻子

class ParserError(Exception): 
    pass 


class Sentence(object): 

def __init__(self, subject, verb, object): 
    # remember we take ('noun','princess') tuples and convert them 
    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) #Here it's returning 'noun' from the noun/princess tuple 

     if word[0] == expecting: #Here it's testing whether or not the new item in the  0 position ('noun' in this case) = 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') 

    if peek(word_list) == 'verb': 
     return match(word_list, 'verb') 
    else: 
     raise ParserError("Expected a verb next.") 


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: 
     raise ParserError("Expected a noun or direction 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': 
     # assume the subject is the player then 
     return parse_subject(word_list, ('noun', 'player')) 
    else: 
     raise ParserError("Must start with subject, object, or verb not: %s" % start) 

我的问题是在那里我应该创建一个句子对象功能parse_sentence。所以,我需要在我的测试代码来创建另一个句子的对象,并确保它是相同的:

def test_parse_subject(): 
    word_list = [('verb', 'kill'), ('direction', 'north')] 

    subj = ('noun', 'princess') 
    verb = ('verb', 'kill') 
    obj = ('direction', 'north') 
    obj_sent = Sentence(subj, verb, obj) 

    assert_equal(parser.parse_subject(word_list, subj), obj_sent) 

但我不断收到这个追踪错误:

Traceback (most recent call last): 
    File "G:\Python27\lib\site-packages\nose\case.py", line 197, in runTest 
    self.test(*self.arg) 
    File "G:\Users\Charles\dropbox\programming\parsing_test\skeleton\tests\parser_tests.py", line 45, in test_parse_subjec 
t 
    assert_equal(parser.parse_subject(word_list, subj), obj_sent) 
AssertionError: <ex49.parser.Sentence object at 0x02651C50> != <ex49.parser.Sentence object at 0x02651C30> 

,所以它不是返回的对象一样,但我很确定他们是。我给了他们正确的论点。如果对象相同,我如何确认?在此先感谢

回答