問題

我是python的新手,我正在學習使用pytest.我有一個定義為:

 class Matrix:

    def __init__(self, *rows):
        row_length = len(rows[0])
        for row in rows:
            # TODO skip first
            if len(row) != row_length:
                raise SystemError("Rows does not have equal length")

        self._rows = [*rows]

    def __eq__(self, other):
        return isinstance(self, other.__class__) and \
               all([x == y for x, y in zip_longest(self._rows, other._rows)])

    # other methods omitted for simplicity...
 

我寫了一個__eq__(self, other)的測試,如下所示:

 def test_eq():
    m1 = Matrix([[1,2,3],[4,5,6]])
    m2 = Matrix([1,2,3],[4,5,6])
    m3 = Matrix([1,2,3],[5,4,6])
    assert m1 == m2
    assert m2 == m1
    assert m2 != m3
 

Wich應該傳遞,因為m1m2具有相同的行,m3在第二行有區別.但是,當我執行此測試時,我有輸出:

     def test_eq():
        m1 = Matrix([[1,2,3],[4,5,6]])
        m2 = Matrix([1,2,3],[4,5,6])
        m3 = Matrix([1,2,3],[5,4,6])
>       assert m1 == m2
E       assert <exercises.matrix.Matrix object at 0x10ccd67d0> == <exercises.matrix.Matrix object at 0x10ccd6810>

 

我在這裡錯過了什麼?我正在使用Python 3.7.4和pytest版本5.1.2.提前致謝您的評論/答案


注意:我根據ggorlen答案更改了實現,但我遇到了類似的問題


  最佳答案

比較中的行應該是這樣的:

 for i, i_row in enumerate(self._rows):
    if i_row != other._rows[i]:
        return False
 

但如果other的行超過self,這仍然不會返回正確的結果,所以:

 def __eq__(self, other):
    return isinstance(self, other.__class__) and \
           len(other._rows) == len(self._rows) and \
           all([x == y for x, y in zip(self._rows, other._rows)])
 

該屬性稱為 _rows,我們需要使用 [] 將其索引到列表中,而不是括號中。

一個可能更快的版本,可以在失敗的比較之前儲存:

 def __eq__(self, other):
    if isinstance(self, other.__class__) and \
      len(other._rows) == len(self._rows):
        for i, row in enumerate(self._rows):
            if row != other._rows[i]:
                return False

        return True

    return False
 

在測試中,您可能有一個打字:

 m1 = Matrix([[1,2,3],[4,5,6]]) # <-- this matrix has an extra `[]` wrapper
m2 = Matrix([1,2,3],[4,5,6])   # <-- but this one just uses flat lists
 

所以這些矩陣不等於


小建議:

  • 在不良引數上提高ValueErrorArgumentError而不是SystemError.
  • 考慮使用 Numpy.matx ,而不是滾動自己的矩陣。

  相同標籤的其他問題

python-3.xpytest