diff --git a/si-units/src/extra_units.rs b/si-units/src/extra_units.rs index dc4fcfd..6259427 100644 --- a/si-units/src/extra_units.rs +++ b/si-units/src/extra_units.rs @@ -1,8 +1,8 @@ -use crate::{PySIObject, QuantityError, _JOULE, _KELVIN, _METER}; +use crate::{_JOULE, _KELVIN, _METER, PySIObject, QuantityError}; +use pyo3::PyTypeInfo; use pyo3::exceptions::PyTypeError; use pyo3::prelude::*; use pyo3::types::{PyFloat, PyNotImplemented}; -use pyo3::PyTypeInfo; #[pyclass(module = "si_units")] #[derive(Clone, Copy)] @@ -110,6 +110,10 @@ impl Angle { Self(-self.0) } + fn value_in(&self, unit: Self) -> f64 { + self.0 / unit.0 + } + fn sin(&self) -> f64 { self.0.sin() } diff --git a/si-units/src/lib.rs b/si-units/src/lib.rs index dc36a43..73e1f07 100644 --- a/si-units/src/lib.rs +++ b/si-units/src/lib.rs @@ -135,11 +135,17 @@ impl PySIObject { self.unit.eq(&other.unit) } - pub fn value_in<'py>(&self, py: Python<'py>, unit: &Self) -> PyResult> { - self.check_units(unit)?; - self.value - .bind(py) - .call_method1("__truediv__", (&unit.value,)) + pub fn value_in<'py>( + &self, + py: Python<'py>, + unit: &Bound<'py, PyAny>, + ) -> PyResult> { + if unit.cast::().is_ok() { + return self.__truediv__(unit); + } + let u = unit.extract::>()?; + self.check_units(&u)?; + self.value.bind(py).call_method1("__truediv__", (&u.value,)) } #[classattr] diff --git a/si-units/src/si_units/_core.pyi b/si-units/src/si_units/_core.pyi index e3b956b..576fd61 100644 --- a/si-units/src/si_units/_core.pyi +++ b/si-units/src/si_units/_core.pyi @@ -204,6 +204,7 @@ class Angle: def __rmul__(self, lhs: float) -> Self: ... def __truediv__(self, rhs: Any) -> Any: ... def __neg__(self) -> Self: ... + def value_in(self, unit: Self) -> float: ... def sin(self) -> float: ... def cos(self) -> float: ... def tan(self) -> float: ...