API
Simple Unit module
Angle
Bases: _EnumUnit
Angle unit set
Source code in unit_simple/unit_simple.py
class Angle(_EnumUnit):
"""Angle unit set"""
RAD = Si.M / Si.M
DEGREE = RAD * math.pi / 180
Charge
Bases: _EnumUnit
Charge unit set
Source code in unit_simple/unit_simple.py
class Charge(_EnumUnit):
"""Charge unit set"""
C = Si.A * Si.S
Current
Bases: _EnumUnit
Electric current unit set
Source code in unit_simple/unit_simple.py
class Current(_EnumUnit):
"""Electric current unit set"""
A = Si.A
DerivedUnit
Bases: Unit
unite definie comme combinaison de facteurs d'unites, chacune elevee a une puissance rationnelle
Source code in unit_simple/unit_simple.py
class DerivedUnit(Unit):
"""unite definie comme combinaison de facteurs d'unites, chacune elevee a une puissance rationnelle"""
def __init__(self, *definition):
super().__init__()
self._definition = definition
def definition(self):
"""collection des facteurs de definition de l'unite derivee"""
return self._definition
def to_base(self) -> UnitConverter:
transform = UnitConverters.identity()
for factor in self._definition:
transform = factor.dim().to_base().linear_pow(factor.power()).concatenate(transform)
return transform
definition()
collection des facteurs de definition de l'unite derivee
Source code in unit_simple/unit_simple.py
def definition(self):
"""collection des facteurs de definition de l'unite derivee"""
return self._definition
Energy
Bases: _EnumUnit
Energy unit set
Source code in unit_simple/unit_simple.py
class Energy(_EnumUnit):
"""Energy unit set"""
J = Si.KG * Si.M ** 2 * Si.S ** -2
Factor
representation d'une unite elevee a une puissance rationnelle
Source code in unit_simple/unit_simple.py
class Factor:
"""representation d'une unite elevee a une puissance rationnelle"""
def __init__(self, unit, numerator: int = 1, denominator: int = 1):
if isinstance(unit, Unit):
self._unit = unit
self._numerator = numerator
self._denominator = denominator
else:
self._unit = unit.dim()
self._numerator = numerator * unit.numerator()
self._denominator = denominator * unit.denominator()
def dim(self):
"""dimension (unite) du facteur"""
return self._unit
def numerator(self) -> int:
"""numerateur de la puissance rationnelle du facteur"""
return self._numerator
def denominator(self) -> int:
"""denominateur de la puissance rationnelle du facteur"""
return self._denominator
def power(self) -> float:
"""puissance du facteur"""
return self._numerator / self._denominator
def __mul__(self, other):
return DerivedUnit(self, other)
def __truediv__(self, other):
return DerivedUnit(self, Factor(other, -1))
def __invert__(self):
return DerivedUnit(Factor(self, -1))
denominator()
denominateur de la puissance rationnelle du facteur
Source code in unit_simple/unit_simple.py
def denominator(self) -> int:
"""denominateur de la puissance rationnelle du facteur"""
return self._denominator
dim()
dimension (unite) du facteur
Source code in unit_simple/unit_simple.py
def dim(self):
"""dimension (unite) du facteur"""
return self._unit
numerator()
numerateur de la puissance rationnelle du facteur
Source code in unit_simple/unit_simple.py
def numerator(self) -> int:
"""numerateur de la puissance rationnelle du facteur"""
return self._numerator
power()
puissance du facteur
Source code in unit_simple/unit_simple.py
def power(self) -> float:
"""puissance du facteur"""
return self._numerator / self._denominator
Force
Bases: _EnumUnit
Force unit set
Source code in unit_simple/unit_simple.py
class Force(_EnumUnit):
"""Force unit set"""
N = Si.KG * Si.M / Si.S ** 2
Frequency
Bases: _EnumUnit
Frequency unit set
Source code in unit_simple/unit_simple.py
class Frequency(_EnumUnit):
"""Frequency unit set"""
HZ = ~Si.S
FundamentalUnit
Bases: Unit
unite definie par elle-meme
Source code in unit_simple/unit_simple.py
class FundamentalUnit(Unit):
"""unite definie par elle-meme"""
def to_base(self) -> UnitConverter:
return UnitConverters.identity()
Intensity
Bases: _EnumUnit
Luminous intensity unit set
Source code in unit_simple/unit_simple.py
class Intensity(_EnumUnit):
"""Luminous intensity unit set"""
CD = Si.CD
Length
Bases: _EnumUnit
Length unit set
Source code in unit_simple/unit_simple.py
class Length(_EnumUnit):
"""Length unit set"""
M = Si.M
Mass
Bases: _EnumUnit
Mass unit set
Source code in unit_simple/unit_simple.py
class Mass(_EnumUnit):
"""Mass unit set"""
G = Si.KG / 1000
KG = Si.KG
Metric
Bases: Enum
definition des prefixes du systeme metrique
Source code in unit_simple/unit_simple.py
class Metric(Enum):
"""definition des prefixes du systeme metrique"""
YOTTA = 1e24
ZETTA = 1e21
EXA = 1e18
PETA = 1e15
TERA = 1e12
GIGA = 1e9
MEGA = 1e6
KILO = 1000
HECTO = 100
DEKA = 10
DECI = 1e-1
CENTI = 1e-2
MILLI = 1e-3
MICRO = 1e-6
NANO = 1e-9
PICO = 1e-12
FEMTO = 1e-15
ZEPTO = 1e-21
YOCTO = 1e-24
def __init__(self, factor: float):
self._factor = factor
def prefix(self, unit: Unit) -> TransformedUnit:
"""application du prefixe du systeme metrique a une unite"""
return unit.scale_multiply(value=self._factor)
def __call__(self, *args, **kwargs):
return self.prefix(args[0])
prefix(unit)
application du prefixe du systeme metrique a une unite
Source code in unit_simple/unit_simple.py
def prefix(self, unit: Unit) -> TransformedUnit:
"""application du prefixe du systeme metrique a une unite"""
return unit.scale_multiply(value=self._factor)
Si
Bases: _EnumUnit
Si unit set.
Source code in unit_simple/unit_simple.py
class Si(_EnumUnit):
"""
Si unit set.
"""
S = FundamentalUnit()
M = FundamentalUnit()
_G = FundamentalUnit()
KG = Metric.KILO(_G)
A = FundamentalUnit()
K = FundamentalUnit()
MOL = FundamentalUnit()
CD = FundamentalUnit()
SolidAngle
Bases: _EnumUnit
Solid angle unit set
Source code in unit_simple/unit_simple.py
class SolidAngle(_EnumUnit):
"""Solid angle unit set"""
SR = Si.M * Si.M / (Si.M * Si.M)
Speed
Bases: _EnumUnit
Linear speed unit set
Source code in unit_simple/unit_simple.py
class Speed(_EnumUnit):
"""Linear speed unit set"""
M_PER_S = Length.M / Time.S
Substance
Bases: _EnumUnit
Amount of substance unit set
Source code in unit_simple/unit_simple.py
class Substance(_EnumUnit):
"""Amount of substance unit set"""
MOL = Si.MOL
Surface
Bases: _EnumUnit
Surface unit set
Source code in unit_simple/unit_simple.py
class Surface(_EnumUnit):
"""Surface unit set"""
M2 = Si.M * Si.M
Temperature
Bases: _EnumUnit
Thermodynamic temperature unit set
Source code in unit_simple/unit_simple.py
class Temperature(_EnumUnit):
"""Thermodynamic temperature unit set"""
K = Si.K
C = K + 273.15
R = K * 5 / 9
F = R + 459.67
Time
Bases: _EnumUnit
Time unit set
Source code in unit_simple/unit_simple.py
class Time(_EnumUnit):
"""Time unit set"""
S = Si.S
TransformedUnit
Bases: Unit
unite definie par transformation d'une unite de reference
Source code in unit_simple/unit_simple.py
class TransformedUnit(Unit):
"""unite definie par transformation d'une unite de reference"""
def __init__(self, to_reference: UnitConverter, reference: Unit):
super().__init__()
self._to_reference = to_reference
self._reference = reference
def to_reference(self) -> UnitConverter:
"""convertisseur de l'unite d'appel vers l'unite de reference"""
return self._to_reference
def reference(self) -> Unit:
"""unite de reference de l'unite transformer"""
return self._reference
def to_base(self) -> UnitConverter:
return self.reference().to_base().concatenate(converter=self.to_reference())
reference()
unite de reference de l'unite transformer
Source code in unit_simple/unit_simple.py
def reference(self) -> Unit:
"""unite de reference de l'unite transformer"""
return self._reference
to_reference()
convertisseur de l'unite d'appel vers l'unite de reference
Source code in unit_simple/unit_simple.py
def to_reference(self) -> UnitConverter:
"""convertisseur de l'unite d'appel vers l'unite de reference"""
return self._to_reference
Unit
Bases: Factor
classe abstraite de fonctionnalites communes a toutes les unites
Source code in unit_simple/unit_simple.py
class Unit(Factor):
"""classe abstraite de fonctionnalites communes a toutes les unites"""
def __init__(self):
super().__init__(self, numerator=1, denominator=1)
def get_converter_to(self, target) -> UnitConverter:
"""construit un convertisseur de l'unite d'appel vers l'unite cible en parametre"""
return target.to_base().inverse().concatenate(converter=self.to_base())
def to_base(self) -> UnitConverter:
"""construit un convertisseur vers le jeu d'unites fondamentales sous-jascent a l'unite d'appel"""
def translate(self, value: float):
"""construit une unite transformee en decalant l'origine de l'echelle de la valeur en parametre par rapport a
l'unite d'appel"""
return TransformedUnit(to_reference=UnitConverters.translation(translation=value), reference=self)
def shift(self, value: float):
"""construit une unite transformee en decalant l'origine de l'echelle de la valeur en parametre par rapport a
l'unite d'appel"""
return self.translate(value)
def scale_multiply(self, value: float):
"""construit une unite transformee en multipliant le facteur d'echelle par la valeur en parametre par rapport a
l'unite d'appel"""
return TransformedUnit(to_reference=UnitConverters.scaling(scale=value), reference=self)
def scale_divide(self, value: float):
"""construit une unite transformee en divisant le facteur d'echelle par la valeur en parametre par rapport a
l'unite d'appel"""
return self.scale_multiply(value=1.0 / value)
def factor(self, numerator: int, denominator: int = 1):
"""construit un facteur de l'unite d'appel eleve a la puissance rationnelle dont le numerateur et le
denominateur sont en parametre"""
return Factor(self, numerator=numerator, denominator=denominator)
def __add__(self, other):
return self.shift(other)
def __sub__(self, other):
return self.shift(-other)
def __mul__(self, other):
if isinstance(other, Factor):
return super().__mul__(other)
return self.scale_multiply(other)
def __rmul__(self, other):
return self.scale_multiply(other)
def __rtruediv__(self, other):
return DerivedUnit(self.factor(-1)).scale_multiply(other)
def __truediv__(self, other):
if isinstance(other, Factor):
return super().__truediv__(other)
return self.scale_divide(other)
def __pow__(self, power, modulo=None):
if isinstance(power, int):
return DerivedUnit(self.factor(power))
raise ValueError
def __rshift__(self, other):
return self.get_converter_to(other)
def __lshift__(self, other):
return self.get_converter_to(other).inverse()
factor(numerator, denominator=1)
construit un facteur de l'unite d'appel eleve a la puissance rationnelle dont le numerateur et le denominateur sont en parametre
Source code in unit_simple/unit_simple.py
def factor(self, numerator: int, denominator: int = 1):
"""construit un facteur de l'unite d'appel eleve a la puissance rationnelle dont le numerateur et le
denominateur sont en parametre"""
return Factor(self, numerator=numerator, denominator=denominator)
get_converter_to(target)
construit un convertisseur de l'unite d'appel vers l'unite cible en parametre
Source code in unit_simple/unit_simple.py
def get_converter_to(self, target) -> UnitConverter:
"""construit un convertisseur de l'unite d'appel vers l'unite cible en parametre"""
return target.to_base().inverse().concatenate(converter=self.to_base())
scale_divide(value)
construit une unite transformee en divisant le facteur d'echelle par la valeur en parametre par rapport a l'unite d'appel
Source code in unit_simple/unit_simple.py
def scale_divide(self, value: float):
"""construit une unite transformee en divisant le facteur d'echelle par la valeur en parametre par rapport a
l'unite d'appel"""
return self.scale_multiply(value=1.0 / value)
scale_multiply(value)
construit une unite transformee en multipliant le facteur d'echelle par la valeur en parametre par rapport a l'unite d'appel
Source code in unit_simple/unit_simple.py
def scale_multiply(self, value: float):
"""construit une unite transformee en multipliant le facteur d'echelle par la valeur en parametre par rapport a
l'unite d'appel"""
return TransformedUnit(to_reference=UnitConverters.scaling(scale=value), reference=self)
shift(value)
construit une unite transformee en decalant l'origine de l'echelle de la valeur en parametre par rapport a l'unite d'appel
Source code in unit_simple/unit_simple.py
def shift(self, value: float):
"""construit une unite transformee en decalant l'origine de l'echelle de la valeur en parametre par rapport a
l'unite d'appel"""
return self.translate(value)
to_base()
construit un convertisseur vers le jeu d'unites fondamentales sous-jascent a l'unite d'appel
Source code in unit_simple/unit_simple.py
def to_base(self) -> UnitConverter:
"""construit un convertisseur vers le jeu d'unites fondamentales sous-jascent a l'unite d'appel"""
translate(value)
construit une unite transformee en decalant l'origine de l'echelle de la valeur en parametre par rapport a l'unite d'appel
Source code in unit_simple/unit_simple.py
def translate(self, value: float):
"""construit une unite transformee en decalant l'origine de l'echelle de la valeur en parametre par rapport a
l'unite d'appel"""
return TransformedUnit(to_reference=UnitConverters.translation(translation=value), reference=self)
UnitConverter
Converter between units.
Examples:
A converter represents an inversible affine transform.
Do not use the inverse constructor parameter since it is internally computed.
>>> import unit_simple as su
>>>
>>> unit_converter = su.UnitConverter(scale=2.0, offset=1.2)
>>> print(unit_converter.convert(2))
>>> print(unit_converter.scale())
>>> print(unit_converter.offset())
Unit converters are used to build a transformed unit from a reference unit.
>>> import unit_simple as su
>>>
>>> k = su.FundamentalUnit()
>>> f = su.TransformedUnit(to_reference=su.UnitConverter(scale=5/9)
>>> .concatenate(su.UnitConverter(scale=1, offset=459.67)),
>>> reference=k)
Most of the time, unit converters are not directly instancitated.
>>> import unit_simple as su
>>>
>>> unit_converter = su.UnitConverter(scale=2.0, offset=1.2)
>>> inverse_converter = unit_converter.inverse()
>>> print(inverse_converter.convert(2))
>>> print(inverse_converter.scale())
>>> print(inverse_converter.offset())
Most of the transformed units are only built from scaling or translation affine transforms and can be
instantiated using the built-in Unit methods.
>>> import unit_simple as su
>>>
>>> m = su.FundamentalUnit()
>>> km = m.scale_multiply(1000)
>>> cm = m.scale_divide(100)
>>>
>>> k = su.FundamentalUnit()
>>> c = k.shift(273.15)
See Also:
UnitConverter.inverse: build the inverse converter
Source code in unit_simple/unit_simple.py
class UnitConverter:
"""Converter between units.
Examples:
---------
A converter represents an inversible affine transform.
Do not use the inverse constructor parameter since it is internally computed.
>>> import unit_simple as su
>>>
>>> unit_converter = su.UnitConverter(scale=2.0, offset=1.2)
>>> print(unit_converter.convert(2))
>>> print(unit_converter.scale())
>>> print(unit_converter.offset())
Unit converters are used to build a transformed unit from a reference unit.
>>> import unit_simple as su
>>>
>>> k = su.FundamentalUnit()
>>> f = su.TransformedUnit(to_reference=su.UnitConverter(scale=5/9)
>>> .concatenate(su.UnitConverter(scale=1, offset=459.67)),
>>> reference=k)
Most of the time, unit converters are not directly instancitated.
>>> import unit_simple as su
>>>
>>> unit_converter = su.UnitConverter(scale=2.0, offset=1.2)
>>> inverse_converter = unit_converter.inverse()
>>> print(inverse_converter.convert(2))
>>> print(inverse_converter.scale())
>>> print(inverse_converter.offset())
Most of the transformed units are only built from scaling or translation affine transforms and can be
instantiated using the built-in Unit methods.
>>> import unit_simple as su
>>>
>>> m = su.FundamentalUnit()
>>> km = m.scale_multiply(1000)
>>> cm = m.scale_divide(100)
>>>
>>> k = su.FundamentalUnit()
>>> c = k.shift(273.15)
See Also:
---------
UnitConverter.inverse: build the inverse converter
"""
def __init__(self, scale: float != 0., translation: float = 0.0, inverse=None):
assert scale != 0.
self._scale = scale
self._translation = translation
if scale == 1. and translation == 0. and inverse is None:
self._inverse = self
else:
self._inverse = UnitConverter(scale=1. / self._scale,
translation=-self._translation / self._scale,
inverse=self) if inverse is None else inverse
def scale(self):
"""pente (facteur d'echelle) de la conversion"""
return self._scale
def offset(self):
"""decalage d'origine d'echelle"""
return self._translation
def inverse(self):
"""Inverse converter, from the target unit to the source unit of the current converter.
"""
return self._inverse
def linear(self):
"""convertisseur lineaire conservant uniquement le facteur d'echelle du convertisseur d'appel"""
# comparaison volontaire avec un double
if self._translation == 0.:
return self
return UnitConverters.scaling(scale=self._scale)
def linear_pow(self, power: float):
"""convertisseur lineaire conservant uniquement le facteur d'echelle du convertisseur d'appel, eleve a la
puissance en parametre"""
# comparaison volontaire avec des doubles
if self._translation == 0. and power == 1.:
return self
return UnitConverters.scaling(scale=self._scale ** power)
def convert(self, value: float) -> float:
"""exprime la valeur en parametre dans l'unite cible du convertisseur en faisant l'hypothese qu'elle est
exprimee dans son unite source"""
return value * self._scale + self._translation
def concatenate(self, converter):
"""convertisseur correspondant a la combinaison de la conversion du convertisseur en parametre suivie de la
conversion du convertisseur d'appel"""
return UnitConverter(scale=converter.scale() * self.scale(),
translation=self.convert(converter.offset()))
def __invert__(self):
return self.inverse()
def __call__(self, *args, **kwargs):
return self.convert(args[0])
concatenate(converter)
convertisseur correspondant a la combinaison de la conversion du convertisseur en parametre suivie de la conversion du convertisseur d'appel
Source code in unit_simple/unit_simple.py
def concatenate(self, converter):
"""convertisseur correspondant a la combinaison de la conversion du convertisseur en parametre suivie de la
conversion du convertisseur d'appel"""
return UnitConverter(scale=converter.scale() * self.scale(),
translation=self.convert(converter.offset()))
convert(value)
exprime la valeur en parametre dans l'unite cible du convertisseur en faisant l'hypothese qu'elle est exprimee dans son unite source
Source code in unit_simple/unit_simple.py
def convert(self, value: float) -> float:
"""exprime la valeur en parametre dans l'unite cible du convertisseur en faisant l'hypothese qu'elle est
exprimee dans son unite source"""
return value * self._scale + self._translation
inverse()
Inverse converter, from the target unit to the source unit of the current converter.
Source code in unit_simple/unit_simple.py
def inverse(self):
"""Inverse converter, from the target unit to the source unit of the current converter.
"""
return self._inverse
linear()
convertisseur lineaire conservant uniquement le facteur d'echelle du convertisseur d'appel
Source code in unit_simple/unit_simple.py
def linear(self):
"""convertisseur lineaire conservant uniquement le facteur d'echelle du convertisseur d'appel"""
# comparaison volontaire avec un double
if self._translation == 0.:
return self
return UnitConverters.scaling(scale=self._scale)
linear_pow(power)
convertisseur lineaire conservant uniquement le facteur d'echelle du convertisseur d'appel, eleve a la puissance en parametre
Source code in unit_simple/unit_simple.py
def linear_pow(self, power: float):
"""convertisseur lineaire conservant uniquement le facteur d'echelle du convertisseur d'appel, eleve a la
puissance en parametre"""
# comparaison volontaire avec des doubles
if self._translation == 0. and power == 1.:
return self
return UnitConverters.scaling(scale=self._scale ** power)
offset()
decalage d'origine d'echelle
Source code in unit_simple/unit_simple.py
def offset(self):
"""decalage d'origine d'echelle"""
return self._translation
scale()
pente (facteur d'echelle) de la conversion
Source code in unit_simple/unit_simple.py
def scale(self):
"""pente (facteur d'echelle) de la conversion"""
return self._scale
UnitConverters
Bases: Enum
utility unit converter factory
Source code in unit_simple/unit_simple.py
class UnitConverters(Enum):
"""utility unit converter factory"""
_IDENTITY = UnitConverter(scale=1.0)
@staticmethod
def scaling(scale: float):
"""build a linear converter"""
return UnitConverter(scale=scale)
@staticmethod
def translation(translation: float):
"""build an offset converter"""
return UnitConverter(scale=1.0, translation=translation)
@staticmethod
def identity():
"""get the instance of the identity converter"""
return UnitConverters._IDENTITY.value
identity()
staticmethod
get the instance of the identity converter
Source code in unit_simple/unit_simple.py
@staticmethod
def identity():
"""get the instance of the identity converter"""
return UnitConverters._IDENTITY.value
scaling(scale)
staticmethod
build a linear converter
Source code in unit_simple/unit_simple.py
@staticmethod
def scaling(scale: float):
"""build a linear converter"""
return UnitConverter(scale=scale)
translation(translation)
staticmethod
build an offset converter
Source code in unit_simple/unit_simple.py
@staticmethod
def translation(translation: float):
"""build an offset converter"""
return UnitConverter(scale=1.0, translation=translation)
Voltage
Bases: _EnumUnit
Voltage unit set
Source code in unit_simple/unit_simple.py
class Voltage(_EnumUnit):
"""Voltage unit set"""
V = Si.KG * Si.M ** 2 * Si.S ** -3 * ~Si.A
Volume
Bases: _EnumUnit
Volume unit set
Source code in unit_simple/unit_simple.py
class Volume(_EnumUnit):
"""Volume unit set"""
M3 = Si.M * Surface.M2