Source code for pint.converters
"""
pint.converters
~~~~~~~~~~~~~~~
Functions and classes related to unit conversions.
:copyright: 2016 by Pint Authors, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
"""
from __future__ import annotations
from dataclasses import dataclass
from dataclasses import fields as dc_fields
from .compat import HAS_NUMPY, exp, log # noqa: F401
[docs]@dataclass(frozen=True)
class Converter:
"""Base class for value converters."""
_subclasses = []
_param_names_to_subclass = {}
@property
def is_multiplicative(self):
return True
@property
def is_logarithmic(self):
return False
def to_reference(self, value, inplace=False):
return value
def from_reference(self, value, inplace=False):
return value
def __init_subclass__(cls, **kwargs):
# Get constructor parameters
super().__init_subclass__(**kwargs)
cls._subclasses.append(cls)
@classmethod
def get_field_names(cls, new_cls):
return frozenset((p.name for p in dc_fields(new_cls)))
@classmethod
def preprocess_kwargs(cls, **kwargs):
return None
@classmethod
def from_arguments(cls, **kwargs):
kwk = frozenset(kwargs.keys())
try:
new_cls = cls._param_names_to_subclass[kwk]
except KeyError:
for new_cls in cls._subclasses:
p_names = frozenset((p.name for p in dc_fields(new_cls)))
if p_names == kwk:
cls._param_names_to_subclass[kwk] = new_cls
break
else:
params = "(" + ", ".join(tuple(kwk)) + ")"
raise ValueError(
f"There is no class registered for parameters {params}"
)
kw = new_cls.preprocess_kwargs(**kwargs)
if kw is None:
return new_cls(**kwargs)
return cls.from_arguments(**kw)