Commit a6216749 authored by Raymond Hettinger's avatar Raymond Hettinger

Add support for copy, deepcopy, and pickle.

parent 909e334e
......@@ -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)
......@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment