2012-02-16 2 views
2

Можно ли использовать assert_equal для сравнения объектов? Я продолжаю видеть эту ошибку:Изучите Python Hard Way, Ex 49: Сравнение объектов с использованием assert_equal

AssertionError: <ex49.parser.Sentence object at 0x01F1BAF0> != 
<ex49.parser.Sentence object at 0x01F1BB10> 

Соответствующий фрагмент кода:

def test_parse_subject(): 

    testsentence = "princess go east" 
    result = lexicon.scan(testsentence) 
    Sent = parse_sentence(result) 
    ResultSent = Sentence(('subject', 'princess'), 
         ('verb', 'go'), 
         ('object', 'east')) 
    print ResultSent.subject 
    print ResultSent.verb 
    print ResultSent.object 
    print Sent.subject 
    print Sent.verb 
    print Sent.object 
    assert_equal(Sent, ResultSent) 

Печатающие выходы на экране показывает, что объекты имеют такое же содержание - пока ошибка утверждение показывает вверх. Почему это? Есть ли способ использовать assert_equal, чтобы переопределить это?

ответ

6

Я считаю, что вам нужно реализовать метод __eq__ в классе Sentence.

assertEqual(first, second, msg=None)¶ Test that first and second are equal. If the values do not compare equal, the test will fail.

In addition, if first and second are the exact same type and one of list, tuple, dict, set, frozenset or unicode or any type that a subclass registers with addTypeEqualityFunc() the type-specific equality function will be called in order to generate a more useful default error message (see also the list of type-specific methods).

Python unittest documentation

The correspondence between operator symbols and method names is as follows: xlt(y), x<=y calls x.le(y), x==y calls x.eq(y), x!=y and x<>y call x.ne(y), x>y calls x.gt(y), and x>=y calls x.ge(y).

Python data model documentation

пример:

import unittest 


class A: 

    def __init__(self, num): 
     self.num = num 

    def __eq__(self, other): 
     return self.num == other.num 


class Test(unittest.TestCase): 

    def test(self): 
     a1 = A(1) 
     a12 = A(1) 
     a2 = A(2) 

     self.assertEqual(a1, a1, 'a1 != a1') 
     self.assertEqual(a1, a12, 'a1 != a12') 
     self.assertEqual(a1, a2, 'a1 != a2') 

def main(): 
    unittest.TestRunner(Test()) 

if __name__ == '__main__': 
    unittest.main() 

Теперь комментарии метод __eq__ и увидеть разницу.

0

Я тоже работаю через LPTHW ex49. Специально для контекста данного примера, я был в состоянии получить его на работу, добавив __eq __() метод класса Предложению, следующим образом:

Class Sentence(object): 

    def __init__(self, subject, verb, object_) 
     ... 

    def __eq__(self, other): 
     return (self.subject == other.subject and 
       self.verb == other.verb and 
       self.object_ == other.object_) 

Затем в тестовом файле, я сделал:

# where LIST5 is defined above to give list of two tuples, [('verb', 'go'), ('direction', 'east')] 
def test_parse_subject(): 
    wordlist = list(LIST5) 
    sent = parse.Sentence(('noun', 'person'), ('verb'), ('go'), ('direction', 'east)) 
    newsent = parse.parse_subject(wordlist, ('noun', 'person')) 
    assert_equal(newsent, sent) 

Насколько я могу судить (новичок в этом), assert_equal с носом и unittest вызовет метод __eq __(), если он существует. В этом случае тест в порядке, если два объекта имеют одинаковые три значения для объекта, глагола, объекта_. Тем не менее, это заняло у меня некоторое время, чтобы понять, потому что у меня была ошибка в моем коде, и единственное, что нос предоставил, - это то же сообщение об ошибке, которое вы получили, даже когда у меня был метод __eq __(). То есть, он предоставил объект AssertionError: ... в объекте 0x ...! = ... в 0x ... »Это заставило меня задуматься о том, что метод __eq __() не работает, поскольку он выглядел так, как будто он был сравнение адресов. Не уверен, есть ли лучший способ сделать это.

ПРИМЕЧАНИЕ. Я переименовал объект в объект_, потому что gedit выделял объект как ключевое слово python. Не уверен, рекомендуется ли использовать нижний подчеркивание.

1

Это хорошая информация, для меня, я был слишком ленив, чтобы найти, так что я просто сравнили переменные двух объектов, как показано ниже:

def test_parse_subject(): 
    word_list_a = lexicon.scan("eat the bear") 
    Sentence1 = Sentence(('noun','player'),('verb', 'eat'),('noun', 'bear')) 
    Sentence2 = parse_subject(word_list_a,('noun','player')) 

    assert_equal(Sentence2.subject, Sentence1.subject) 
    assert_equal(Sentence2.verb, Sentence1.verb) 
    assert_equal(Sentence2.object, Sentence1.object) 
Смежные вопросы