Coverage for gpkit/units.py: 100%

48 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2024-01-07 22:15 -0500

1"wraps pint in gpkit monomials" 

2import pint 

3ureg = pint.UnitRegistry() 

4ureg.define("USD = [money] = $") 

5pint.set_application_registry(ureg) 

6Quantity = ureg.Quantity 

7DimensionalityError = pint.DimensionalityError 

8QTY_CACHE = {} 

9 

10 

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] 

16 

17 

18class GPkitUnits: 

19 "Return Monomials instead of Quantitites" 

20 division_cache = {} 

21 multiplication_cache = {} 

22 monomial_cache = {} 

23 

24 def __call__(self, unity): 

25 "Returns a unit Monomial, caching the result for future retrievals" 

26 from . import Monomial # pylint: disable=import-outside-toplevel 

27 if unity not in self.monomial_cache: 

28 self.monomial_cache[unity] = Monomial(qty(unity)) 

29 return self.monomial_cache[unity] 

30 

31 __getattr__ = __call__ 

32 

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 as exc: 

48 raise DimensionalityError(numerator, denominator) from exc 

49 return self.division_cache[key] 

50 

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] 

63 

64 

65units = GPkitUnits()