From: Jeffrey Yasskin Date: Fri, 1 Feb 2008 07:05:46 +0000 (+0000) Subject: Roll back r60248. It's useful to encourage users not to change Rational X-Git-Tag: v2.6a1~326 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dc2964b0d849389bffde95b8f76fd112049e114f;p=python Roll back r60248. It's useful to encourage users not to change Rational instances. --- diff --git a/Lib/rational.py b/Lib/rational.py index 2222045add..bc2259bb54 100755 --- a/Lib/rational.py +++ b/Lib/rational.py @@ -43,7 +43,7 @@ class Rational(RationalAbc): """ - __slots__ = ('numerator', 'denominator') + __slots__ = ('_numerator', '_denominator') # We're immutable, so use __new__ not __init__ def __new__(cls, numerator=0, denominator=1): @@ -93,8 +93,8 @@ class Rational(RationalAbc): raise ZeroDivisionError('Rational(%s, 0)' % numerator) g = gcd(numerator, denominator) - self.numerator = int(numerator // g) - self.denominator = int(denominator // g) + self._numerator = int(numerator // g) + self._denominator = int(denominator // g) return self @classmethod @@ -168,6 +168,14 @@ class Rational(RationalAbc): result = new return result + @property + def numerator(a): + return a._numerator + + @property + def denominator(a): + return a._denominator + def __repr__(self): """repr(self)""" return ('Rational(%r,%r)' % (self.numerator, self.denominator)) diff --git a/Lib/test/test_rational.py b/Lib/test/test_rational.py index 3c3d1f96fe..1c378742a5 100644 --- a/Lib/test/test_rational.py +++ b/Lib/test/test_rational.py @@ -119,6 +119,17 @@ class RationalTest(unittest.TestCase): r.__init__(2, 15) self.assertEquals((7, 3), _components(r)) + self.assertRaises(AttributeError, setattr, r, 'numerator', 12) + self.assertRaises(AttributeError, setattr, r, 'denominator', 6) + self.assertEquals((7, 3), _components(r)) + + # But if you _really_ need to: + r._numerator = 4 + r._denominator = 2 + self.assertEquals((4, 2), _components(r)) + # Which breaks some important operations: + self.assertNotEquals(R(4, 2), r) + def testFromFloat(self): self.assertRaisesMessage( TypeError, "Rational.from_float() only takes floats, not 3 (int)",