From 37bcfd1d2f3d778dfce4a8984ba806036d11a49f Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Wed, 11 Nov 2020 20:10:17 +0100 Subject: [PATCH] Simplify distance conversion (#43107) --- homeassistant/util/distance.py | 129 +++++++-------------------------- 1 file changed, 25 insertions(+), 104 deletions(-) diff --git a/homeassistant/util/distance.py b/homeassistant/util/distance.py index 3bb3c258516..0e0a060c49c 100644 --- a/homeassistant/util/distance.py +++ b/homeassistant/util/distance.py @@ -1,5 +1,6 @@ """Distance util functions.""" from numbers import Number +from typing import Callable, Dict from homeassistant.const import ( LENGTH, @@ -25,6 +26,28 @@ VALID_UNITS = [ LENGTH_YARD, ] +TO_METERS: Dict[str, Callable[[float], float]] = { + LENGTH_METERS: lambda meters: meters, + LENGTH_MILES: lambda miles: miles * 1609.344, + LENGTH_YARD: lambda yards: yards * 0.9144, + LENGTH_FEET: lambda feet: feet * 0.3048, + LENGTH_INCHES: lambda inches: inches * 0.0254, + LENGTH_KILOMETERS: lambda kilometers: kilometers * 1000, + LENGTH_CENTIMETERS: lambda centimeters: centimeters * 0.01, + LENGTH_MILLIMETERS: lambda millimeters: millimeters * 0.001, +} + +METERS_TO: Dict[str, Callable[[float], float]] = { + LENGTH_METERS: lambda meters: meters, + LENGTH_MILES: lambda meters: meters * 0.000621371, + LENGTH_YARD: lambda meters: meters * 1.09361, + LENGTH_FEET: lambda meters: meters * 3.28084, + LENGTH_INCHES: lambda meters: meters * 39.3701, + LENGTH_KILOMETERS: lambda meters: meters * 0.001, + LENGTH_CENTIMETERS: lambda meters: meters * 100, + LENGTH_MILLIMETERS: lambda meters: meters * 1000, +} + def convert(value: float, unit_1: str, unit_2: str) -> float: """Convert one unit of measurement to another.""" @@ -39,108 +62,6 @@ def convert(value: float, unit_1: str, unit_2: str) -> float: if unit_1 == unit_2 or unit_1 not in VALID_UNITS: return value - meters: float = value + meters: float = TO_METERS[unit_1](value) - if unit_1 == LENGTH_MILES: - meters = __miles_to_meters(value) - elif unit_1 == LENGTH_YARD: - meters = __yards_to_meters(value) - elif unit_1 == LENGTH_FEET: - meters = __feet_to_meters(value) - elif unit_1 == LENGTH_INCHES: - meters = __inches_to_meters(value) - elif unit_1 == LENGTH_KILOMETERS: - meters = __kilometers_to_meters(value) - elif unit_1 == LENGTH_CENTIMETERS: - meters = __centimeters_to_meters(value) - elif unit_1 == LENGTH_MILLIMETERS: - meters = __millimeters_to_meters(value) - - result = meters - - if unit_2 == LENGTH_MILES: - result = __meters_to_miles(meters) - elif unit_2 == LENGTH_YARD: - result = __meters_to_yards(meters) - elif unit_2 == LENGTH_FEET: - result = __meters_to_feet(meters) - elif unit_2 == LENGTH_INCHES: - result = __meters_to_inches(meters) - elif unit_2 == LENGTH_KILOMETERS: - result = __meters_to_kilometers(meters) - elif unit_2 == LENGTH_CENTIMETERS: - result = __meters_to_centimeters(meters) - elif unit_2 == LENGTH_MILLIMETERS: - result = __meters_to_millimeters(meters) - - return result - - -def __miles_to_meters(miles: float) -> float: - """Convert miles to meters.""" - return miles * 1609.344 - - -def __yards_to_meters(yards: float) -> float: - """Convert yards to meters.""" - return yards * 0.9144 - - -def __feet_to_meters(feet: float) -> float: - """Convert feet to meters.""" - return feet * 0.3048 - - -def __inches_to_meters(inches: float) -> float: - """Convert inches to meters.""" - return inches * 0.0254 - - -def __kilometers_to_meters(kilometers: float) -> float: - """Convert kilometers to meters.""" - return kilometers * 1000 - - -def __centimeters_to_meters(centimeters: float) -> float: - """Convert centimeters to meters.""" - return centimeters * 0.01 - - -def __millimeters_to_meters(millimeters: float) -> float: - """Convert millimeters to meters.""" - return millimeters * 0.001 - - -def __meters_to_miles(meters: float) -> float: - """Convert meters to miles.""" - return meters * 0.000621371 - - -def __meters_to_yards(meters: float) -> float: - """Convert meters to yards.""" - return meters * 1.09361 - - -def __meters_to_feet(meters: float) -> float: - """Convert meters to feet.""" - return meters * 3.28084 - - -def __meters_to_inches(meters: float) -> float: - """Convert meters to inches.""" - return meters * 39.3701 - - -def __meters_to_kilometers(meters: float) -> float: - """Convert meters to kilometers.""" - return meters * 0.001 - - -def __meters_to_centimeters(meters: float) -> float: - """Convert meters to centimeters.""" - return meters * 100 - - -def __meters_to_millimeters(meters: float) -> float: - """Convert meters to millimeters.""" - return meters * 1000 + return METERS_TO[unit_2](meters)