]> granicus.if.org Git - python/commitdiff
Add support for copy, deepcopy, and pickle.
authorRaymond Hettinger <python@rcn.com>
Fri, 25 Jan 2008 00:21:54 +0000 (00:21 +0000)
committerRaymond Hettinger <python@rcn.com>
Fri, 25 Jan 2008 00:21:54 +0000 (00:21 +0000)
Lib/rational.py
Lib/test/test_rational.py

index 0d3ea2f04f11e58804e00452894680b1751cf669..031ee0f20ea9eb56fd2345007e7980cab6fb5334 100755 (executable)
@@ -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)
index 3242e438862b2a2f94ef45a7447cced2eabc357f..20abce26df45268bfa9fdd34421f47ba6f9ba33b 100644 (file)
@@ -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)