Coverage for gpkit/units.py: 100%
48 statements
« prev ^ index » next coverage.py v6.4.2, created at 2022-07-28 11:42 -0400
« prev ^ index » next coverage.py v6.4.2, created at 2022-07-28 11:42 -0400
1"wraps pint in gpkit monomials"
2import pint
3ureg = pint.UnitRegistry() # pylint: disable=invalid-name
4ureg.define("USD = [money] = $")
5pint.set_application_registry(ureg)
6Quantity = ureg.Quantity
7DimensionalityError = pint.DimensionalityError
8QTY_CACHE = {}
11def qty(unit):
12 "Returns a Quantity, caching the result for future retrievals"
13 if unit not in QTY_CACHE:
14 QTY_CACHE[unit] = Quantity(1, unit)
15 return QTY_CACHE[unit]
18class GPkitUnits:
19 "Return Monomials instead of Quantitites"
20 division_cache = {}
21 multiplication_cache = {}
22 monomial_cache = {}
24 def __call__(self, unity):
25 "Returns a unit Monomial, caching the result for future retrievals"
26 from . import Monomial
27 if unity not in self.monomial_cache:
28 self.monomial_cache[unity] = Monomial(qty(unity))
29 return self.monomial_cache[unity]
31 __getattr__ = __call__
33 def of_division(self, numerator, denominator):
34 "Cached unit division. Requires Quantity inputs."
35 if numerator.units is denominator.units:
36 return 1
37 key = (id(numerator.units), id(denominator.units))
38 try:
39 return self.division_cache[key]
40 except KeyError:
41 if numerator.units and denominator.units:
42 conversion = numerator.units/denominator.units
43 else:
44 conversion = numerator.units or 1/denominator.units
45 try:
46 self.division_cache[key] = float(conversion)
47 except DimensionalityError:
48 raise DimensionalityError(numerator, denominator)
49 return self.division_cache[key]
51 def of_product(self, thing1, thing2):
52 "Cached unit division. Requires united inputs."
53 key = (thing1.units, thing2.units)
54 try:
55 return self.multiplication_cache[key]
56 except KeyError:
57 mul_units = qty((thing1*thing2).units)
58 try:
59 self.multiplication_cache[key] = (None, float(mul_units))
60 except DimensionalityError:
61 self.multiplication_cache[key] = (mul_units, None)
62 return self.multiplication_cache[key]
65units = GPkitUnits()