bpo-39350: Fix fractions for int subclasses (GH-18375)
Fix regression in fractions.Fraction if the numerator and/or the
denominator is an int subclass. The math.gcd() function is now
used to normalize the numerator and denominator. math.gcd() always
return a int type. Previously, the GCD type depended on numerator
and denominator.
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index 4649a34..c748533 100644
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -703,6 +703,28 @@
r = F(13, 7)
self.assertRaises(AttributeError, setattr, r, 'a', 10)
+ def test_int_subclass(self):
+ class myint(int):
+ def __mul__(self, other):
+ return type(self)(int(self) * int(other))
+ def __floordiv__(self, other):
+ return type(self)(int(self) // int(other))
+ def __mod__(self, other):
+ x = type(self)(int(self) % int(other))
+ return x
+ @property
+ def numerator(self):
+ return type(self)(int(self))
+ @property
+ def denominator(self):
+ return type(self)(1)
+
+ f = fractions.Fraction(myint(1 * 3), myint(2 * 3))
+ self.assertEqual(f.numerator, 1)
+ self.assertEqual(f.denominator, 2)
+ self.assertEqual(type(f.numerator), myint)
+ self.assertEqual(type(f.denominator), myint)
+
if __name__ == '__main__':
unittest.main()