mirror of https://github.com/python/cpython
Add support for copy, deepcopy, and pickle.
This commit is contained in:
parent
909e334e8a
commit
a6216749fb
|
@ -490,3 +490,18 @@ class Rational(RationalAbc):
|
||||||
def __nonzero__(a):
|
def __nonzero__(a):
|
||||||
"""a != 0"""
|
"""a != 0"""
|
||||||
return a.numerator != 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 operator
|
||||||
import rational
|
import rational
|
||||||
import unittest
|
import unittest
|
||||||
|
from copy import copy, deepcopy
|
||||||
|
from cPickle import dumps, loads
|
||||||
R = rational.Rational
|
R = rational.Rational
|
||||||
|
|
||||||
def _components(r):
|
def _components(r):
|
||||||
|
@ -359,6 +361,12 @@ class RationalTest(unittest.TestCase):
|
||||||
s += num / fact * sign
|
s += num / fact * sign
|
||||||
self.assertAlmostEquals(math.cos(1), s)
|
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():
|
def test_main():
|
||||||
run_unittest(RationalTest)
|
run_unittest(RationalTest)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue