From 8fb35b0b4c9ecb5858b275cf78d9ca6e1ef0581f Mon Sep 17 00:00:00 2001 From: AN Long Date: Thu, 2 Nov 2023 17:18:55 +0800 Subject: [PATCH 01/13] Add test for numbers.Complex --- Lib/test/test_abstract_numbers.py | 82 ++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index 2e06f0d16fdd05..b4394e9876de5b 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -3,12 +3,13 @@ import math import operator import unittest -from numbers import Complex, Real, Rational, Integral +from numbers import Complex, Real, Rational, Integral, Number class TestNumbers(unittest.TestCase): def test_int(self): self.assertTrue(issubclass(int, Integral)) self.assertTrue(issubclass(int, Complex)) + self.assertTrue(issubclass(int, Number)) self.assertEqual(7, int(7).real) self.assertEqual(0, int(7).imag) @@ -20,6 +21,7 @@ def test_int(self): def test_float(self): self.assertFalse(issubclass(float, Rational)) self.assertTrue(issubclass(float, Real)) + self.assertTrue(issubclass(float, Number)) self.assertEqual(7.3, float(7.3).real) self.assertEqual(0, float(7.3).imag) @@ -29,6 +31,7 @@ def test_float(self): def test_complex(self): self.assertFalse(issubclass(complex, Real)) self.assertTrue(issubclass(complex, Complex)) + self.assertTrue(issubclass(complex, Number)) c1, c2 = complex(3, 2), complex(4,1) # XXX: This is not ideal, but see the comment in math_trunc(). @@ -40,5 +43,82 @@ def test_complex(self): self.assertRaises(TypeError, int, c1) +class TestSubclassNumbers(unittest.TestCase): + def test_subclass_complex(self): + class MyComplex(Complex): + def __init__(self, real, imag): + self.r = real + self.i = imag + + def __complex__(self): + pass + + @property + def real(self): + return self.r + + @property + def imag(self): + return self.i + + def __add__(self, other): + if isinstance(other, Complex): + return MyComplex(self.imag + other.imag, + self.real + other.real) + if isinstance(other, Number): + return MyComplex(self.imag + 0, self.real + other.real) + + def __radd__(self, other): + pass + + def __neg__(self): + return MyComplex(-self.real, -self.imag) + + def __pos__(self): + pass + + def __mul__(self, other): + pass + + def __rmul__(self, other): + pass + + def __truediv__(self, other): + pass + + def __rtruediv__(self, other): + pass + + def __pow__(self, exponent): + pass + + def __rpow__(self, base): + pass + + def __abs__(self): + pass + + def conjugate(self): + pass + + def __eq__(self, other): + if isinstance(other, Complex): + return self.imag == other.imag and self.real == other.real + if isinstance(other, Number): + return self.imag == 0 and self.real == other.real + + # test __bool__ + self.assertTrue(bool(MyComplex(1, 1))) + self.assertTrue(bool(MyComplex(0, 1))) + self.assertTrue(bool(MyComplex(1, 0))) + self.assertFalse(bool(MyComplex(0, 0))) + + # test __sub__ + self.assertEqual(MyComplex(2, 3) - complex(1, 2), MyComplex(1, 1)) + + # test __rsub__ + self.assertEqual(complex(2, 3) - MyComplex(1, 2), MyComplex(1, 1)) + + if __name__ == "__main__": unittest.main() From 424959d8735d1253900f92f350aa7894a8594efb Mon Sep 17 00:00:00 2001 From: AN Long Date: Sat, 4 Nov 2023 23:49:52 +0800 Subject: [PATCH 02/13] add read tests --- Lib/test/test_abstract_numbers.py | 94 +++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index b4394e9876de5b..070c26e30dd11a 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -119,6 +119,100 @@ def __eq__(self, other): # test __rsub__ self.assertEqual(complex(2, 3) - MyComplex(1, 2), MyComplex(1, 1)) + def test_real(self): + class MyReal(Real): + def __init__(self, n): + self.n = n + + def __add__(self, other): + raise NotImplementedError + + def __radd__(self, other): + raise NotImplementedError + + def __neg__(self): + raise NotImplementedError + + def __pos__(self): + return self.n + + def __mul__(self, other): + raise NotImplementedError + + def __rmul__(self, other): + raise NotImplementedError + + def __truediv__(self, other): + raise NotImplementedError + + def __rtruediv__(self, other): + raise NotImplementedError + + def __pow__(self, exponent): + raise NotImplementedError + + def __rpow__(self, base): + raise NotImplementedError + + def __abs__(self): + raise NotImplementedError + + def __eq__(self, other): + raise NotImplementedError + + def __float__(self): + return float(self.n) + + def __trunc__(self): + raise NotImplementedError + + def __floor__(self): + raise NotImplementedError + + def __ceil__(self): + raise NotImplementedError + + def __round__(self, ndigits=None): + raise NotImplementedError + + def __floordiv__(self, other): + return self.n // other + + def __rfloordiv__(self, other): + return other // self.n + + def __mod__(self, other): + return self.n % other + + def __rmod__(self, other): + return other % self.n + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + raise NotImplementedError + + # test conjugate + + # test __divmod__ + self.assertEqual(divmod(MyReal(3), 2), (1, 1)) + + # test __rdivmod__ + self.assertEqual(divmod(3, MyReal(2)), (1, 1)) + + # test __complex__ + self.assertEqual(complex(MyReal(1)).imag, 0j) + + # test real + self.assertEqual(MyReal(3).real, 3) + + # test imag + self.assertEqual(MyReal(3).imag, 0) + + # test conjugate + self.assertEqual(MyReal(123).conjugate(), 123) + if __name__ == "__main__": unittest.main() From 89e584cf5fe9a780a852a6ae898e1d262f611479 Mon Sep 17 00:00:00 2001 From: AN Long Date: Sun, 5 Nov 2023 00:45:17 +0800 Subject: [PATCH 03/13] add test for rational and integral --- Lib/test/test_abstract_numbers.py | 209 +++++++++++++++++++++++++++++- 1 file changed, 208 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index 070c26e30dd11a..cc5460e836c60f 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -119,7 +119,7 @@ def __eq__(self, other): # test __rsub__ self.assertEqual(complex(2, 3) - MyComplex(1, 2), MyComplex(1, 1)) - def test_real(self): + def test_subclass_real(self): class MyReal(Real): def __init__(self, n): self.n = n @@ -214,5 +214,212 @@ def __le__(self, other): self.assertEqual(MyReal(123).conjugate(), 123) + def test_subclass_rational(self): + class MyRational(Rational): + def __init__(self, numerator, denominator): + self.n = numerator + self.d = denominator + + def __add__(self, other): + raise NotImplementedError + + def __radd__(self, other): + raise NotImplementedError + + def __neg__(self): + raise NotImplementedError + + def __pos__(self): + raise NotImplementedError + + def __mul__(self, other): + raise NotImplementedError + + def __rmul__(self, other): + raise NotImplementedError + + def __truediv__(self, other): + raise NotImplementedError + + def __rtruediv__(self, other): + raise NotImplementedError + + def __pow__(self, exponent): + raise NotImplementedError + + def __rpow__(self, base): + raise NotImplementedError + + def __abs__(self): + raise NotImplementedError + + def __eq__(self, other): + raise NotImplementedError + + def __trunc__(self): + raise NotImplementedError + + def __floor__(self): + raise NotImplementedError + + def __ceil__(self): + raise NotImplementedError + + def __round__(self, ndigits=None): + raise NotImplementedError + + def __floordiv__(self, other): + raise NotImplementedError + + def __rfloordiv__(self, other): + raise NotImplementedError + + def __mod__(self, other): + raise NotImplementedError + + def __rmod__(self, other): + raise NotImplementedError + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + raise NotImplementedError + + @property + def numerator(self): + return self.n + + @property + def denominator(self): + return self.d + + # test__float__ + self.assertEqual(float(MyRational(9, 3)), 3) + + + def test_subclass_integral(self): + class MyIntegral(Integral): + def __init__(self, n): + self.n = n + + def __add__(self, other): + raise NotImplementedError + + def __radd__(self, other): + raise NotImplementedError + + def __neg__(self): + raise NotImplementedError + + def __pos__(self): + return self.n + + def __mul__(self, other): + raise NotImplementedError + + def __rmul__(self, other): + raise NotImplementedError + + def __truediv__(self, other): + raise NotImplementedError + + def __rtruediv__(self, other): + raise NotImplementedError + + def __pow__(self, exponent): + raise NotImplementedError + + def __rpow__(self, base): + raise NotImplementedError + + def __abs__(self): + raise NotImplementedError + + def __eq__(self, other): + raise NotImplementedError + + def __trunc__(self): + raise NotImplementedError + + def __floor__(self): + raise NotImplementedError + + def __ceil__(self): + raise NotImplementedError + + def __round__(self, ndigits=None): + raise NotImplementedError + + def __floordiv__(self, other): + raise NotImplementedError + + def __rfloordiv__(self, other): + raise NotImplementedError + + def __mod__(self, other): + raise NotImplementedError + + def __rmod__(self, other): + raise NotImplementedError + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + raise NotImplementedError + + def __int__(self): + return self.n + + def __pow__(self, exponent, modulus=None): + raise NotImplementedError + + def __lshift__(self, other): + raise NotImplementedError + + def __rlshift__(self, other): + raise NotImplementedError + + def __rshift__(self, other): + raise NotImplementedError + + def __rrshift__(self, other): + raise NotImplementedError + + def __and__(self, other): + raise NotImplementedError + + def __rand__(self, other): + raise NotImplementedError + + def __xor__(self, other): + raise NotImplementedError + + def __rxor__(self, other): + raise NotImplementedError + + def __or__(self, other): + raise NotImplementedError + + def __ror__(self, other): + raise NotImplementedError + + def __invert__(self): + raise NotImplementedError + + # test __index__ + self.assertEqual(operator.index(MyIntegral(123)), 123) + + # test __float__ + self.assertEqual(float(MyIntegral(123)), 123.0) + + # test numerator + self.assertEqual(MyIntegral(123).numerator, 123) + + # test denominator + self.assertEqual(MyIntegral(123).denominator, 1) + + if __name__ == "__main__": unittest.main() From 86958981dffe85911f939a711565dbb1bbe7a382 Mon Sep 17 00:00:00 2001 From: AN Long Date: Sun, 5 Nov 2023 00:55:44 +0800 Subject: [PATCH 04/13] update test names --- Lib/test/test_abstract_numbers.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index cc5460e836c60f..4d442804c0157f 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -43,8 +43,8 @@ def test_complex(self): self.assertRaises(TypeError, int, c1) -class TestSubclassNumbers(unittest.TestCase): - def test_subclass_complex(self): +class TestNumbersDefaultMethods(unittest.TestCase): + def test_complex(self): class MyComplex(Complex): def __init__(self, real, imag): self.r = real @@ -119,7 +119,7 @@ def __eq__(self, other): # test __rsub__ self.assertEqual(complex(2, 3) - MyComplex(1, 2), MyComplex(1, 1)) - def test_subclass_real(self): + def test_real(self): class MyReal(Real): def __init__(self, n): self.n = n @@ -214,7 +214,7 @@ def __le__(self, other): self.assertEqual(MyReal(123).conjugate(), 123) - def test_subclass_rational(self): + def test_rational(self): class MyRational(Rational): def __init__(self, numerator, denominator): self.n = numerator @@ -298,7 +298,7 @@ def denominator(self): self.assertEqual(float(MyRational(9, 3)), 3) - def test_subclass_integral(self): + def test_integral(self): class MyIntegral(Integral): def __init__(self, n): self.n = n From 8b1d574c980f2b43c063d3263591c2e8fa4bd211 Mon Sep 17 00:00:00 2001 From: AN Long Date: Sun, 5 Nov 2023 01:24:47 +0800 Subject: [PATCH 05/13] fix lint errors --- Lib/test/test_abstract_numbers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index 4d442804c0157f..062dedff0aced1 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -49,18 +49,18 @@ class MyComplex(Complex): def __init__(self, real, imag): self.r = real self.i = imag - + def __complex__(self): pass @property def real(self): return self.r - + @property def imag(self): return self.i - + def __add__(self, other): if isinstance(other, Complex): return MyComplex(self.imag + other.imag, From d210654bd1ca695d4b85b8de30624c1ff6da7b57 Mon Sep 17 00:00:00 2001 From: AN Long Date: Sun, 5 Nov 2023 13:52:01 +0800 Subject: [PATCH 06/13] fix lint errors --- Lib/test/test_abstract_numbers.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index 062dedff0aced1..a830912c027f0b 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -51,7 +51,7 @@ def __init__(self, real, imag): self.i = imag def __complex__(self): - pass + raise NotImplementedError @property def real(self): @@ -69,37 +69,37 @@ def __add__(self, other): return MyComplex(self.imag + 0, self.real + other.real) def __radd__(self, other): - pass + raise NotImplementedError def __neg__(self): return MyComplex(-self.real, -self.imag) def __pos__(self): - pass + raise NotImplementedError def __mul__(self, other): - pass + raise NotImplementedError def __rmul__(self, other): - pass + raise NotImplementedError def __truediv__(self, other): - pass + raise NotImplementedError def __rtruediv__(self, other): - pass + raise NotImplementedError def __pow__(self, exponent): - pass + raise NotImplementedError def __rpow__(self, base): - pass + raise NotImplementedError def __abs__(self): - pass + raise NotImplementedError def conjugate(self): - pass + raise NotImplementedError def __eq__(self, other): if isinstance(other, Complex): @@ -327,9 +327,6 @@ def __truediv__(self, other): def __rtruediv__(self, other): raise NotImplementedError - def __pow__(self, exponent): - raise NotImplementedError - def __rpow__(self, base): raise NotImplementedError From f6ef1897948558629163269c0d536a11c84ce728 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Sun, 5 Nov 2023 05:54:19 +0000 Subject: [PATCH 07/13] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20b?= =?UTF-8?q?lurb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst diff --git a/Misc/NEWS.d/next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst b/Misc/NEWS.d/next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst new file mode 100644 index 00000000000000..b6fd7a6122ac24 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst @@ -0,0 +1 @@ +Add more tests for :mod:`numbers`. From e0d70458f29d7a070a25a696bb42d592f7a7081a Mon Sep 17 00:00:00 2001 From: AN Long Date: Mon, 6 Nov 2023 20:32:57 +0800 Subject: [PATCH 08/13] =?UTF-8?q?Revert=20"=F0=9F=93=9C=F0=9F=A4=96=20Adde?= =?UTF-8?q?d=20by=20blurb=5Fit."?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f6ef1897948558629163269c0d536a11c84ce728. --- .../next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Misc/NEWS.d/next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst diff --git a/Misc/NEWS.d/next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst b/Misc/NEWS.d/next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst deleted file mode 100644 index b6fd7a6122ac24..00000000000000 --- a/Misc/NEWS.d/next/Tests/2023-11-05-05-54-15.gh-issue-77465.ym9-Sk.rst +++ /dev/null @@ -1 +0,0 @@ -Add more tests for :mod:`numbers`. From 017456e05cb0b0637a86eaf6826dceb9c2c7cb38 Mon Sep 17 00:00:00 2001 From: AN Long Date: Fri, 19 Jan 2024 16:26:51 +0800 Subject: [PATCH 09/13] Use concretize decorator to reduce codes Co-authored-by: Serhiy Storchaka --- Lib/test/test_abstract_numbers.py | 269 +++--------------------------- 1 file changed, 21 insertions(+), 248 deletions(-) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index a830912c027f0b..2cf1b7b20dadf6 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -1,10 +1,27 @@ """Unit tests for numbers.py.""" +import abc import math import operator import unittest from numbers import Complex, Real, Rational, Integral, Number + +def concretize(cls): + def not_implemented(*args, **kwargs): + raise NotImplementedError() + + for name in dir(cls): + try: + value = getattr(cls, name) + if value.__isabstractmethod__: + setattr(cls, name, not_implemented) + except AttributeError: + pass + abc.update_abstractmethods(cls) + return cls + + class TestNumbers(unittest.TestCase): def test_int(self): self.assertTrue(issubclass(int, Integral)) @@ -45,14 +62,12 @@ def test_complex(self): class TestNumbersDefaultMethods(unittest.TestCase): def test_complex(self): + @concretize class MyComplex(Complex): def __init__(self, real, imag): self.r = real self.i = imag - def __complex__(self): - raise NotImplementedError - @property def real(self): return self.r @@ -68,39 +83,9 @@ def __add__(self, other): if isinstance(other, Number): return MyComplex(self.imag + 0, self.real + other.real) - def __radd__(self, other): - raise NotImplementedError - def __neg__(self): return MyComplex(-self.real, -self.imag) - def __pos__(self): - raise NotImplementedError - - def __mul__(self, other): - raise NotImplementedError - - def __rmul__(self, other): - raise NotImplementedError - - def __truediv__(self, other): - raise NotImplementedError - - def __rtruediv__(self, other): - raise NotImplementedError - - def __pow__(self, exponent): - raise NotImplementedError - - def __rpow__(self, base): - raise NotImplementedError - - def __abs__(self): - raise NotImplementedError - - def conjugate(self): - raise NotImplementedError - def __eq__(self, other): if isinstance(other, Complex): return self.imag == other.imag and self.real == other.real @@ -120,61 +105,17 @@ def __eq__(self, other): self.assertEqual(complex(2, 3) - MyComplex(1, 2), MyComplex(1, 1)) def test_real(self): + @concretize class MyReal(Real): def __init__(self, n): self.n = n - def __add__(self, other): - raise NotImplementedError - - def __radd__(self, other): - raise NotImplementedError - - def __neg__(self): - raise NotImplementedError - def __pos__(self): return self.n - def __mul__(self, other): - raise NotImplementedError - - def __rmul__(self, other): - raise NotImplementedError - - def __truediv__(self, other): - raise NotImplementedError - - def __rtruediv__(self, other): - raise NotImplementedError - - def __pow__(self, exponent): - raise NotImplementedError - - def __rpow__(self, base): - raise NotImplementedError - - def __abs__(self): - raise NotImplementedError - - def __eq__(self, other): - raise NotImplementedError - def __float__(self): return float(self.n) - def __trunc__(self): - raise NotImplementedError - - def __floor__(self): - raise NotImplementedError - - def __ceil__(self): - raise NotImplementedError - - def __round__(self, ndigits=None): - raise NotImplementedError - def __floordiv__(self, other): return self.n // other @@ -187,14 +128,6 @@ def __mod__(self, other): def __rmod__(self, other): return other % self.n - def __lt__(self, other): - raise NotImplementedError - - def __le__(self, other): - raise NotImplementedError - - # test conjugate - # test __divmod__ self.assertEqual(divmod(MyReal(3), 2), (1, 1)) @@ -215,77 +148,12 @@ def __le__(self, other): def test_rational(self): + @concretize class MyRational(Rational): def __init__(self, numerator, denominator): self.n = numerator self.d = denominator - def __add__(self, other): - raise NotImplementedError - - def __radd__(self, other): - raise NotImplementedError - - def __neg__(self): - raise NotImplementedError - - def __pos__(self): - raise NotImplementedError - - def __mul__(self, other): - raise NotImplementedError - - def __rmul__(self, other): - raise NotImplementedError - - def __truediv__(self, other): - raise NotImplementedError - - def __rtruediv__(self, other): - raise NotImplementedError - - def __pow__(self, exponent): - raise NotImplementedError - - def __rpow__(self, base): - raise NotImplementedError - - def __abs__(self): - raise NotImplementedError - - def __eq__(self, other): - raise NotImplementedError - - def __trunc__(self): - raise NotImplementedError - - def __floor__(self): - raise NotImplementedError - - def __ceil__(self): - raise NotImplementedError - - def __round__(self, ndigits=None): - raise NotImplementedError - - def __floordiv__(self, other): - raise NotImplementedError - - def __rfloordiv__(self, other): - raise NotImplementedError - - def __mod__(self, other): - raise NotImplementedError - - def __rmod__(self, other): - raise NotImplementedError - - def __lt__(self, other): - raise NotImplementedError - - def __le__(self, other): - raise NotImplementedError - @property def numerator(self): return self.n @@ -299,112 +167,17 @@ def denominator(self): def test_integral(self): + @concretize class MyIntegral(Integral): def __init__(self, n): self.n = n - def __add__(self, other): - raise NotImplementedError - - def __radd__(self, other): - raise NotImplementedError - - def __neg__(self): - raise NotImplementedError - def __pos__(self): return self.n - def __mul__(self, other): - raise NotImplementedError - - def __rmul__(self, other): - raise NotImplementedError - - def __truediv__(self, other): - raise NotImplementedError - - def __rtruediv__(self, other): - raise NotImplementedError - - def __rpow__(self, base): - raise NotImplementedError - - def __abs__(self): - raise NotImplementedError - - def __eq__(self, other): - raise NotImplementedError - - def __trunc__(self): - raise NotImplementedError - - def __floor__(self): - raise NotImplementedError - - def __ceil__(self): - raise NotImplementedError - - def __round__(self, ndigits=None): - raise NotImplementedError - - def __floordiv__(self, other): - raise NotImplementedError - - def __rfloordiv__(self, other): - raise NotImplementedError - - def __mod__(self, other): - raise NotImplementedError - - def __rmod__(self, other): - raise NotImplementedError - - def __lt__(self, other): - raise NotImplementedError - - def __le__(self, other): - raise NotImplementedError - def __int__(self): return self.n - def __pow__(self, exponent, modulus=None): - raise NotImplementedError - - def __lshift__(self, other): - raise NotImplementedError - - def __rlshift__(self, other): - raise NotImplementedError - - def __rshift__(self, other): - raise NotImplementedError - - def __rrshift__(self, other): - raise NotImplementedError - - def __and__(self, other): - raise NotImplementedError - - def __rand__(self, other): - raise NotImplementedError - - def __xor__(self, other): - raise NotImplementedError - - def __rxor__(self, other): - raise NotImplementedError - - def __or__(self, other): - raise NotImplementedError - - def __ror__(self, other): - raise NotImplementedError - - def __invert__(self): - raise NotImplementedError - # test __index__ self.assertEqual(operator.index(MyIntegral(123)), 123) From 734fe45feb71f4c6b738958b832b69c92f0a3aff Mon Sep 17 00:00:00 2001 From: AN Long Date: Fri, 19 Jan 2024 21:17:48 +0800 Subject: [PATCH 10/13] Apply suggestions from code review Co-authored-by: Serhiy Storchaka --- Lib/test/test_abstract_numbers.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index 2cf1b7b20dadf6..248649b7718ce2 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -80,8 +80,7 @@ def __add__(self, other): if isinstance(other, Complex): return MyComplex(self.imag + other.imag, self.real + other.real) - if isinstance(other, Number): - return MyComplex(self.imag + 0, self.real + other.real) + raise NotImplementedError def __neg__(self): return MyComplex(-self.real, -self.imag) @@ -135,7 +134,7 @@ def __rmod__(self, other): self.assertEqual(divmod(3, MyReal(2)), (1, 1)) # test __complex__ - self.assertEqual(complex(MyReal(1)).imag, 0j) + self.assertEqual(complex(MyReal(1)), 1+0j) # test real self.assertEqual(MyReal(3).real, 3) @@ -163,7 +162,7 @@ def denominator(self): return self.d # test__float__ - self.assertEqual(float(MyRational(9, 3)), 3) + self.assertEqual(float(MyRational(5, 2)), 2.5) def test_integral(self): From 83465d55f3a87e3f4be4345b99dbd350a401f47d Mon Sep 17 00:00:00 2001 From: AN Long Date: Fri, 19 Jan 2024 21:23:25 +0800 Subject: [PATCH 11/13] add rational and real to the test_int --- Lib/test/test_abstract_numbers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index 248649b7718ce2..3979b89eceeb45 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -25,6 +25,8 @@ def not_implemented(*args, **kwargs): class TestNumbers(unittest.TestCase): def test_int(self): self.assertTrue(issubclass(int, Integral)) + self.assertTrue(issubclass(int, Rational)) + self.assertTrue(issubclass(int, Real)) self.assertTrue(issubclass(int, Complex)) self.assertTrue(issubclass(int, Number)) From 5be4e5c015d59bc3c7859d8c39fb3bd92f6e67d6 Mon Sep 17 00:00:00 2001 From: AN Long Date: Thu, 25 Jan 2024 19:15:57 +0800 Subject: [PATCH 12/13] add more subclass check --- Lib/test/test_abstract_numbers.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index 3979b89eceeb45..347072f8fbea9d 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -38,8 +38,10 @@ def test_int(self): self.assertEqual(1, int(7).denominator) def test_float(self): + self.assertTrue(issubclass(int, Integral)) self.assertFalse(issubclass(float, Rational)) self.assertTrue(issubclass(float, Real)) + self.assertTrue(issubclass(int, Complex)) self.assertTrue(issubclass(float, Number)) self.assertEqual(7.3, float(7.3).real) @@ -48,6 +50,8 @@ def test_float(self): self.assertEqual(-7.3, float(-7.3).conjugate()) def test_complex(self): + self.assertTrue(issubclass(int, Integral)) + self.assertFalse(issubclass(float, Rational)) self.assertFalse(issubclass(complex, Real)) self.assertTrue(issubclass(complex, Complex)) self.assertTrue(issubclass(complex, Number)) From 67e3e5debd873e0f45af8cfcc28b0b4794bfc584 Mon Sep 17 00:00:00 2001 From: AN Long Date: Thu, 25 Jan 2024 20:21:47 +0800 Subject: [PATCH 13/13] fixed the sloppy mistake --- Lib/test/test_abstract_numbers.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index 347072f8fbea9d..72232b670cdb89 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -38,10 +38,10 @@ def test_int(self): self.assertEqual(1, int(7).denominator) def test_float(self): - self.assertTrue(issubclass(int, Integral)) + self.assertFalse(issubclass(float, Integral)) self.assertFalse(issubclass(float, Rational)) self.assertTrue(issubclass(float, Real)) - self.assertTrue(issubclass(int, Complex)) + self.assertTrue(issubclass(float, Complex)) self.assertTrue(issubclass(float, Number)) self.assertEqual(7.3, float(7.3).real) @@ -50,8 +50,8 @@ def test_float(self): self.assertEqual(-7.3, float(-7.3).conjugate()) def test_complex(self): - self.assertTrue(issubclass(int, Integral)) - self.assertFalse(issubclass(float, Rational)) + self.assertFalse(issubclass(complex, Integral)) + self.assertFalse(issubclass(complex, Rational)) self.assertFalse(issubclass(complex, Real)) self.assertTrue(issubclass(complex, Complex)) self.assertTrue(issubclass(complex, Number))