3 from numbers import Number
4 from typing import Callable
7 class Converter(object):
11 to_canonical: Callable,
12 from_canonical: Callable,
15 self.category = category
16 self.to_canonical = to_canonical
17 self.from_canonical = from_canonical
20 def to_canonical(self, n: Number) -> Number:
21 return self.to_canonical(n)
23 def from_canonical(self, n: Number) -> Number:
24 return self.from_canonical(n)
26 def unit_suffix(self) -> str:
30 conversion_catalog = {
31 "Fahrenheit": Converter("Fahrenheit",
33 lambda f: (f - 32.0) * 0.55555555,
34 lambda c: c * 1.8 + 32.0,
36 "Celsius": Converter("Celsius",
41 "Kelvin": Converter("Kelvin",
49 def convert(magnitude: Number,
51 to_thing: str) -> Number:
52 src = conversion_catalog.get(from_thing, None)
53 dst = conversion_catalog.get(to_thing, None)
54 if src is None or dst is None:
55 raise ValueError("No known conversion")
56 return _convert(magnitude, src, dst)
59 def _convert(magnitude: Number,
61 to_unit: Converter) -> Number:
62 canonical = from_unit.to_canonical(magnitude)
63 converted = to_unit.from_canonical(canonical)
67 def f_to_c(temp_f: float) -> float:
68 """Fahrenheit to Celsius."""
69 return convert(temp_f, "Fahrenheit", "Celsius")
72 def c_to_f(temp_c: float) -> float:
73 """Celsius to Fahrenheit."""
74 return convert(temp_c, "Celsius", "Fahrenheit")