Source code for pyphot.unit_adapters.ezunits_adapter
"""
Adapter to use transparently with the internal ezunits (frozen pint version 0.1; pyphot legacy)
"""
from typing import Any, Union, NewType, Optional, cast
from .units_adapter import UnitsAdapter, UnitTyping, raise_warning
from .ezunits import unit as ez_Unit
from .ezunits import DimensionalityError, UndefinedUnitError
ez_Quantity = NewType("ez_Quantity", ez_Unit.Quantity)
[docs]
class EzUnitsAdapter(UnitsAdapter):
"""Adapter for ezunits"""
typing = UnitTyping(
DimensionalityError=DimensionalityError,
UndefinedUnitError=UndefinedUnitError,
Quantity=ez_Quantity,
)
[docs]
@staticmethod
def U(*args, **kwargs) -> ez_Quantity:
"""Quantity from Unit Registry"""
return cast(ez_Quantity, ez_Unit(*args, **kwargs))
[docs]
@staticmethod
def Q(*args, **kwargs) -> ez_Quantity:
"""Quantity from Unit Registry"""
return cast(ez_Quantity, ez_Unit(*args, **kwargs))
[docs]
@staticmethod
def has_unit(val: Union[Any, ez_Quantity]) -> bool:
"""Check if val is a value with unit information"""
try:
return isinstance(val, ez_Unit.Quantity)
except TypeError:
return hasattr(val, "units") or hasattr(val, "unit")
[docs]
@staticmethod
def val_in_unit(
varname: str,
value: Union[Any, ez_Quantity],
defaultunit: Optional[str] = None,
warn: bool = True,
) -> ez_Quantity:
"""check units and convert to defaultunit or create the unit information
Parameters
----------
varname: str
name of the variable
value: object
value of the variable, which may be unitless
defaultunit: str
default units is unitless
warn: bool
whether to warn if the variable does not have explicit units
Returns
-------
quantity: ez_Quantity
value with units
Example
-------
>>> r = 0.5
>>> print(val_in_unit('r', r, 'degree'))
# UserWarning: Variable r does not have explicit units. Assuming `degree`
<Quantity(0.5, 'degree')>
>>> r = 0.5 * unit['degree']
>>> print(val_in_unit('r', r, 'degree'))
<Quantity(0.5, 'degree')>
"""
if defaultunit is None:
return value
if not EzUnitsAdapter.has_unit(value):
if warn:
msg = "Variable {0:s} does not have explicit units. Assuming `{1:s}`\n"
raise_warning(msg.format(varname, defaultunit), stacklevel=4)
return value * EzUnitsAdapter.U(defaultunit)
else:
return value.to(defaultunit)