Python 如何在比较两个实例时获得更有用的错误消息?

Python 如何在比较两个实例时获得更有用的错误消息?,python,unit-testing,equality,assertion,error-messaging,Python,Unit Testing,Equality,Assertion,Error Messaging,我正在比较两个类实例。下面是我的示例测试代码: from unittest import TestCase class Dog: age: int name: str def __eq__(self, other): if not isinstance(other, Dog): return False return self.age == other.age and self.name == other.na

我正在比较两个类实例。下面是我的示例测试代码:

from unittest import TestCase

class Dog:
    age: int
    name: str

    def __eq__(self, other):
        if not isinstance(other, Dog):
            return False

        return self.age == other.age and self.name == other.name


class MyTests(TestCase):
    def test_compare(self):    
    d1 = Dog()
    d1.age = 1
    d1.name = 'dog1'

    d2 = Dog()
    d2.age = 2
    d2.name = 'dog2'

    self.assertEqual(d1, d2)
这将生成一个断言错误:

AssertionError: <test.Dog object at 0x0000020444FCA520> != <test.Dog object at 0x0000020444F97D60>

我刚刚发现的另一种方法是创建一个helper函数来比较这两个实例

不再需要实现
\uuuu eq\uuu

因为我只需编写一次函数,所以不那么繁琐:

def test_compare(self):        
    d1 = Dog()
    d1.age = 1
    d1.name = 'dog1'

    d2 = Dog()
    d2.age = 2
    d2.name = 'dog2'

    self.__assertDogsAreEqual(d1, d2)

def __assertDogsAreEqual(self, dog1: Dog, dog2: Dog):
    self.assertEqual(dog1.age, dog2.age)
    self.assertEqual(dog1.name, dog2.name)
    
现在,它提供了一条更有用的错误消息:

Traceback (most recent call last):
  File "test.py", line 119, in test_temp
    self.__assertDogsAreEqual(d1, d2)
  File "test.py", line 122, in __assertDogsAreEqual
    self.assertEqual(dog1.age, dog2.age)
AssertionError: 1 != 2
我可能会接受这个答案,但我仍然好奇是否有更好的方法


不过,这看起来是目前最实用的方法。

您可以在类中定义一个
\uuuu repr\uuuu
方法。这用于为调试目的创建对象的字符串表示形式

class Dog:
    age: int
    name: str

    def __init__(self, age, name):
        self.age = age
        self.name = name

    def __eq__(self, other):
        if not isinstance(other, Dog):
            return False

        return self.age == other.age and self.name == other.name

    def __repr__(self):
        return f"{self.__class__.__name__}({repr(self.age)}, {repr(self.name)})"

print(Dog(5, "Fido"))  # Prints "Dog(5, 'Fido')"

@曼维蒂:不,我不认为这是我在寻找的,但无论如何,谢谢你的分享!“我想你会发现,如果你实现str和repr,可能会使用数据类,你会得到更好的消息。”BrianMcCutchon在杰克·泰勒下面的回答中看到了代码的作用后,我想这毕竟与我所寻找的有关@曼维蒂在下面看到杰克·泰勒的答案时,它毕竟回答了我的问题!谢谢你的链接!此外,使用通常会比内置的unittest模块提供更多有用的错误消息。
class Dog:
    age: int
    name: str

    def __init__(self, age, name):
        self.age = age
        self.name = name

    def __eq__(self, other):
        if not isinstance(other, Dog):
            return False

        return self.age == other.age and self.name == other.name

    def __repr__(self):
        return f"{self.__class__.__name__}({repr(self.age)}, {repr(self.name)})"

print(Dog(5, "Fido"))  # Prints "Dog(5, 'Fido')"