Storing value with limits in object
Lie
Lie.1296 at gmail.com
Mon Jun 23 18:22:48 EDT 2008
#!/usr/bin/env python
## VERSION 2
##
## changelog:
## - Uses inheritance from _Limited
## - Added _LimitedLong and llong
## - limit choose between int, long, and float
class _Limited(object):
def setlimits(self, lim):
''' Set the limits and if value is not within limit,
raise ValueError
The lim argument accepts:
- An instance of _Limited, from which to copy the limits
- A two-tuple, which specifies the limits i.e. (min, max)
If lim isn't those or lim[0] > lim[1], raise
InvalidLimitsError
Accepting _Limited instance is just for convenience
'''
if isinstance(lim, _Limited):
self.min, self.max = lim.limits
else:
try:
self.min, self.max = lim
if self.min > self.max: raise ValueError
except (ValueError, TypeError):
raise self.InvalidLimitsError, ('limit = %s' %
str(lim))
if not (self.min < self < self.max):
raise ValueError, \
('val = %s, min = %s, max = %s' % \
(self, self.min, self.max))
def getlimits(self):
return (self.min, self.max)
limits = property(getlimits, setlimits)
class _LimitedInt(int, _Limited):
def __init__(self, value, base = 10):
int.__init__(value, base)
class _LimitedLong(long, _Limited):
def __init__(self, value, base = 10):
long.__init__(value, base)
class _LimitedFloat(float, _Limited):
def __init__(self, value):
float.__init__(value)
def lint(value, limits, base = None):
''' Always Creates _LimitedInt instance, allows the use of base
'''
if base:
ret = _LimitedInt(value, base)
else:
ret = _LimitedInt(value)
ret.limits = limits
return ret
def llong(value, limits, base = None):
''' Always Creates _LimitedLong instance, allows the use of base
'''
if base:
ret = _LimitedLong(value, base)
else:
ret = _LimitedLong(value)
ret.limits = limits
return ret
def lfloat(value, limits):
''' Always Creates _LimitedFloat instance
'''
ret = _LimitedFloat(value)
ret.limits = limits
return ret
def limit(value, limits):
''' Automatically choose between _LimitedInt, _LimitedLong,
or _LimitedFloat. Cannot use _LimitedInt's/Long's base
'''
if isinstance(value, (int, long)):
try:
ret = _LimitedInt(value)
except OverflowError:
ret = _LimitedLong(value)
elif isinstance(value, float):
ret = _LimitedFloat(value)
ret.limits = limits
return ret
More information about the Python-list
mailing list