summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xLib/rational.py15
-rw-r--r--Lib/test/test_rational.py8
2 files changed, 23 insertions, 0 deletions
diff --git a/Lib/rational.py b/Lib/rational.py
index 0d3ea2f..031ee0f 100755
--- a/Lib/rational.py
+++ b/Lib/rational.py
@@ -490,3 +490,18 @@ class Rational(RationalAbc):
def __nonzero__(a):
"""a != 0"""
return a.numerator != 0
+
+ # support for pickling, copy, and deepcopy
+
+ def __reduce__(self):
+ return (self.__class__, (str(self),))
+
+ def __copy__(self):
+ if type(self) == Rational:
+ return self # I'm immutable; therefore I am my own clone
+ return self.__class__(self.numerator, self.denominator)
+
+ def __deepcopy__(self, memo):
+ if type(self) == Rational:
+ return self # My components are also immutable
+ return self.__class__(self.numerator, self.denominator)
diff --git a/Lib/test/test_rational.py b/Lib/test/test_rational.py
index 3242e43..20abce2 100644
--- a/Lib/test/test_rational.py
+++ b/Lib/test/test_rational.py
@@ -6,6 +6,8 @@ import math
import operator
import rational
import unittest
+from copy import copy, deepcopy
+from cPickle import dumps, loads
R = rational.Rational
def _components(r):
@@ -359,6 +361,12 @@ class RationalTest(unittest.TestCase):
s += num / fact * sign
self.assertAlmostEquals(math.cos(1), s)
+ def test_copy_deepcopy_pickle(self):
+ r = R(13, 7)
+ self.assertEqual(r, loads(dumps(r)))
+ self.assertEqual(id(r), id(copy(r)))
+ self.assertEqual(id(r), id(deepcopy(r)))
+
def test_main():
run_unittest(RationalTest)