python unittest 断言失败,重载 __repr__ 导致

2 投票
2 回答
1203 浏览
提问于 2025-04-17 04:44

在我的代码中,我定义了一个类,并为它写了一个自己的表示方法(repr)。这个类的表示应该是一个列表。

def __repr__(self):
    if self.front <= self.tail:
        q = self._queue[self.front:self.tail+1]

    elif self.front > self.tail:
        q = self._queue[self.front:]
        q.extend(self._queue[:self.tail + 1])

    return (q.__repr__())

我写了以下的单元测试来测试这个方法。

def test_enqueue(self):
    q = BoundedQueue(1)
    q.enqueue(1)
    self.assertEqual(q, [1])

但是,我遇到了一个断言错误:

Traceback (most recent call last):
  File "test_internmatch_queue.py", line 13, in test_enqueue
    self.assertEqual(q, [1])
AssertionError: [1] != [1]

我不太明白问题出在哪里……在我看来,[1]==[1]是相等的!我尝试了几种不同的写法在我的表示方法中(如下),但它们也都返回了错误。

return repr(q)
return str(q)

2 个回答

1

在递归状态下,__repr__ 并不是用来判断两个值是否相等的。

你有几个选择:

  1. 定义 __eq__ 方法,这是 Python 用来检查两个对象是否相等的。我不太推荐这个,因为我觉得一个有界队列(BoundedQueue)和一个列表并不算相等。
  2. 定义一个 items() 方法,返回列表。然后可以用这个列表来检查相等性。
  3. 添加一个方法,可以从列表构建一个有界队列。然后再写 __eq__ 方法,用来检查两个有界队列是否相等。
4

q 是一个 BoundedQueue(有界队列)。[1] 是一个 list(列表)。它们不能相等,除非你重写 __eq__ 这个方法。repr 这个东西不是用来判断是否相等的。

撰写回答