diff options
author | Raymond Hettinger <python@rcn.com> | 2008-01-25 00:21:54 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2008-01-25 00:21:54 (GMT) |
commit | a6216749fb88fb508cd469839d77d4264a881bd4 (patch) | |
tree | b61e404c72e88f8ad44d6a82b8739b24a26abebe | |
parent | 909e334e8a525e8430f1532c0ecf133f19d3d185 (diff) | |
download | cpython-a6216749fb88fb508cd469839d77d4264a881bd4.zip cpython-a6216749fb88fb508cd469839d77d4264a881bd4.tar.gz cpython-a6216749fb88fb508cd469839d77d4264a881bd4.tar.bz2 |
Add support for copy, deepcopy, and pickle.
-rwxr-xr-x | Lib/rational.py | 15 | ||||
-rw-r--r-- | Lib/test/test_rational.py | 8 |
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) |