Add rational.Rational as an implementation of numbers.Rational with infinite

precision. This has been discussed at http://bugs.python.org/issue1682. It's
useful primarily for teaching, but it also demonstrates how to implement a
member of the numeric tower, including fallbacks for mixed-mode arithmetic.

I expect to write a couple more patches in this area:
 * Rational.from_decimal()
 * Rational.trim/approximate() (maybe with different names)
 * Maybe remove the parentheses from Rational.__str__()
 * Maybe rename one of the Rational classes
 * Maybe make Rational('3/2') work.
This commit is contained in:
Jeffrey Yasskin 2008-01-15 07:46:24 +00:00
parent ca9c6e433c
commit d7b00334f3
6 changed files with 777 additions and 313 deletions

View file

@ -5,6 +5,7 @@
TODO: Fill out more detailed documentation on the operators."""
from __future__ import division
from abc import ABCMeta, abstractmethod, abstractproperty
__all__ = ["Number", "Exact", "Inexact",
@ -63,7 +64,8 @@ class Complex(Number):
def __complex__(self):
"""Return a builtin complex instance. Called for complex(self)."""
def __bool__(self):
# Will be __bool__ in 3.0.
def __nonzero__(self):
"""True if self != 0. Called for bool(self)."""
return self != 0
@ -98,6 +100,7 @@ class Complex(Number):
"""-self"""
raise NotImplementedError
@abstractmethod
def __pos__(self):
"""+self"""
raise NotImplementedError
@ -122,12 +125,28 @@ class Complex(Number):
@abstractmethod
def __div__(self, other):
"""self / other; should promote to float or complex when necessary."""
"""self / other without __future__ division
May promote to float.
"""
raise NotImplementedError
@abstractmethod
def __rdiv__(self, other):
"""other / self"""
"""other / self without __future__ division"""
raise NotImplementedError
@abstractmethod
def __truediv__(self, other):
"""self / other with __future__ division.
Should promote to float when necessary.
"""
raise NotImplementedError
@abstractmethod
def __rtruediv__(self, other):
"""other / self with __future__ division"""
raise NotImplementedError
@abstractmethod