int/long unification hides bugs

Andrew Dalke adalke at mindspring.com
Thu Oct 28 13:28:05 EDT 2004


Jeremy Fincher wrote:
> The problem with int/long unification is that there is no simple
> pure-Python alternative for those of us who need a bounded integer
> type.  If our code depended on that raised OverflowError in order to
> ensure that our computations were bounded, we're left high and dry
> with ints and longs unified.  We must either drop down to C and write
> a bounded integer type, or we're stuck with code that no longer works.

What's wrong with the example Number wrapper I posted a couple days
ago to this thread?  Here are the essential parts


class RangedNumber:
     def __init__(self, val, low = -sys.maxint-1, high = sys.maxint):
         if not (low <= high):
             raise ValueError("low(= %r) > high(= %r)" % (low, high))
         if not (low <= val <= high):
             raise ValueError("value %r not in range %r to %r" %
                              (val, low, high))
         self.val = val
         self.low = low
         self.high = high
  ....

     def _get_range(self, other):
         if isinstance(other, RangedNumber):
             low = max(self.low, other.low)
             high = min(self.high, other.high)
             other_val = other.val
         else:
             low = self.low
             high = self.high
             other_val = other

         return other_val, low, high

     def __add__(self, other):
         other_val, low, high = self._get_range(other)
         x = self.val + other_val
         return RangedNumber(x, low, high)


  ...

and some of the example code

 >>> a = RangedNumber(10, 0, 100)
 >>> print a
10
 >>> a+90
RangedNumber(100, 0, 100)
 >>> a+91
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "spam.py", line 39, in __add__
     return RangedNumber(x, low, high)
   File "spam.py", line 8, in __init__
     raise ValueError("value %r not in range %r to %r" %
ValueError: value 101 not in range 0 to 100
 >>> 10*a
RangedNumber(100, 0, 100)
 >>> 11*a
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "spam.py", line 67, in __rmul__
     return RangedNumber(x, low, high)
   File "spam.py", line 8, in __init__
     raise ValueError("value %r not in range %r to %r" %
ValueError: value 110 not in range 0 to 100
 >>> b = RangedNumber(18, 5, 30)
 >>> a+b
RangedNumber(28, 5, 30)
 >>>

				Andrew
				dalke at dalkescientific.com



More information about the Python-list mailing list