from scipy import constants
UNITS = {
"length": {
"m": 1,
"cm": constants.centi,
"mm": constants.milli,
"um": constants.micro,
"nm": constants.nano,
"pm": constants.pico,
"in": constants.inch,
"ft": constants.foot,
"yds": constants.yard,
},
"time": {
"s": 1,
"ms": constants.milli,
"us": constants.micro,
"ns": constants.nano,
"ps": constants.pico,
"min": constants.minute,
"hr": constants.hour,
"weeks": constants.week,
"days": constants.day,
},
"frequency": {
"Hz": 1,
"kHz": constants.kilo,
"MHz": constants.mega,
"GHz": constants.giga,
"THz": constants.tera,
"mHz": constants.milli,
},
"angle": {
"rad": 1,
"mrad": constants.milli,
"urad": constants.micro,
"nrad": constants.nano,
"degree": constants.degree,
"turn": 2 * constants.pi,
},
"voltage": {
"V": 1,
"MV": constants.mega,
"kV": constants.kilo,
"mV": constants.milli,
"uV": constants.micro,
},
"current": {
"A": 1,
"MA": constants.mega,
"kA": constants.kilo,
"mA": constants.milli,
"uA": constants.micro,
"nA": constants.nano,
},
}
[docs]def find_unittype(unit):
"""
Find the type of a unit string.
Parameters
----------
unit : str
The unit string
Returns
-------
tp : str
The unit type name or None if not found.
"""
for tp in UNITS.keys():
if unit in UNITS[tp].keys():
return tp
return None
[docs]def find_unit(unit):
"""
Find the conversion of a unit string.
Parameters
----------
unit : str
The unit string
Returns
-------
float or None
The unit value relative to the standard or None if not found.
"""
tp = find_unittype(unit)
if tp:
return UNITS[tp][unit]
else:
return None
[docs]def convert(unit, desired):
"""
Find the conversion rate of two different unit strings.
Parameters
----------
unit : str
The current unit string
desired : str
The desired unit string
Returns
-------
float or None
The relation between unit and desired or None if not found.
"""
current = find_unit(unit)
final = find_unit(desired)
if find_unittype(unit) != find_unittype(desired):
return None
if current and final:
return current / final
[docs]def find_unit_options(unit):
"""
Find the options for a given unit.
Parameters
----------
unit : str
The unit string
Returns
-------
list or None
The list of similar units in crescent order or None if not found.
"""
tp = find_unittype(unit)
if tp:
units = [choice for choice, _ in sorted(UNITS[tp].items(), key=lambda x: 1 / x[1])]
return units
else:
return None