107 lines
2.8 KiB
Python
107 lines
2.8 KiB
Python
import operator
|
|
|
|
class unit:
|
|
|
|
_zero = (0,) * 7
|
|
_negativeOne = (-1, ) * 7
|
|
|
|
_labels = ('m', 'kg', 's', 'A', 'K', 'mol', 'cd')
|
|
|
|
|
|
def __init__(self, value, derivation):
|
|
self.value = value
|
|
self.derivation = derivation
|
|
return
|
|
|
|
|
|
def __add__(self, other):
|
|
if not self.derivation == other.derivation:
|
|
raise ImcompatibleUnits(self, other)
|
|
|
|
return unit(self.value + other.value, self.derivation)
|
|
|
|
|
|
def __sub__(self, other):
|
|
if not self.derivation == other.derivation:
|
|
raise ImcompatibleUnits(self, other)
|
|
|
|
return unit(self.value - other.value, self.derivation)
|
|
|
|
|
|
def __mul__(self, other):
|
|
if type(other) == type(0) or type(other) == type(0.0):
|
|
return unit(other*self.value, self.derivation)
|
|
|
|
value = self.value * other.value
|
|
derivation = tuple(map(operator.add, self.derivation, other.derivation))
|
|
|
|
return unit(value, derivation)
|
|
|
|
|
|
def __div__(self, other):
|
|
if type(other) == type(0) or type(other) == type(0.0):
|
|
return unit(self.value/other, self.derivation)
|
|
|
|
value = self.value / other.value
|
|
derivation = tuple(map(operator.sub, self.derivation, other.derivation))
|
|
|
|
return unit(value, derivation)
|
|
|
|
|
|
def __pow__(self, other):
|
|
if type(other) != type(0) and type(other) != type(0.0):
|
|
raise BadOperation
|
|
|
|
value = self.value ** other
|
|
derivation = tuple(map(operator.mul, [other]*7, self.derivation))
|
|
|
|
return unit(value, derivation)
|
|
|
|
|
|
def __pos__(self): return self
|
|
|
|
|
|
def __neg__(self): return unit(-self.value, self.derivation)
|
|
|
|
|
|
def __abs__(self): return unit(abs(self.value), self.derivation)
|
|
|
|
|
|
def __invert__(self):
|
|
value = 1./self.value
|
|
derivation = tuple(map(operator.mul, self._negativeOne, self.derivation))
|
|
return unit(value, derivation)
|
|
|
|
|
|
def __rmul__(self, other):
|
|
return unit.__mul__(self, other)
|
|
|
|
def __rdiv__(self, other):
|
|
if type(other) != type(0) and type(other) != type(0.0):
|
|
raise BadOperation(self, other)
|
|
|
|
value = other/self.value
|
|
derivation = tuple(map(operator.mul, self._negativeOne, self.derivation))
|
|
|
|
return unit(value, derivation)
|
|
|
|
|
|
def __float__(self):
|
|
return self.value
|
|
#if self.derivation == self._zero: return self.value
|
|
#raise BadConversion(self)
|
|
|
|
|
|
def __str__(self):
|
|
str = "%g" % self.value
|
|
for i in range(0, 7):
|
|
exponent = self.derivation[i]
|
|
if exponent == 0: continue
|
|
if exponent == 1:
|
|
str = str + " %s" % (self._labels[i])
|
|
else:
|
|
str = str + " %s^%d" % (self._labels[i], exponent)
|
|
|
|
return str
|
|
|
|
dimensionless = unit(1, unit._zero)
|