> I am working with a researcher who would be very happy if he > could include units in his calculations. Then, if his > complicated expression didn't result in "kg/yr" the program > would stop and point out his error. > > Does Python (or SciPy or ..) offer this feature?
Well, it's a bit of a hack, but you could try something like ########################################### class InvalidUnits(Exception): pass class Unit(object): def __init__(self, value, units = ''): self.value = value self.units = units def __sub__(self, other): if isinstance(other, Unit): if self.units <> other.units: raise InvalidUnits return Unit(self.value - other.value, self.units) return Unit(self.value - other, self.units) def __add__(self, other): if isinstance(other, Unit): if self.units <> other.units: raise InvalidUnits return Unit(self.value + other.value, self.units) return Unit(self.value + other, self.units) def __mul__(self, other): if isinstance(other, Unit): return Unit(self.value * other.value, "(%s)%s" % (self.units, other.units)) else: return Unit(self.value * other, self.units) def __div__(self, other): if isinstance(other, Unit): return Unit(self.value / other.value, "%s/%s" % (self.units, other.units)) else: return Unit(self.value / other, self.units) def __radd__(self, other): return self.__add__(other) def __rsub__(self, other): return self.__sub__(other) def __rmul__(self, other): return self.__mul__(other) def __rdiv__(self, other): return self.__div__(other) def __repr__(self): return '%i %s' % (self.value, self.units) def __str__(self): return repr(self) ############################################################ which allows you to do things like distance = Unit(80, 'm') print "Distance: %s" % distance time = Unit(2, 'h') print "Time: %s" % time speed = distance/time print "Speed: %s" % speed speed = 3 * speed print "Speed: %s" % speed print "Error:", # can't add dissimilar units print distance + time I'm sure there are loads of other edge cases one would want to consider, such as analyzing and trimming redundant units, but that should give a pretaste of what could be done. -tkc -- http://mail.python.org/mailman/listinfo/python-list