diff options
Diffstat (limited to 'pint/definitions.py')
-rw-r--r-- | pint/definitions.py | 79 |
1 files changed, 57 insertions, 22 deletions
diff --git a/pint/definitions.py b/pint/definitions.py index 7e30c89..f02157b 100644 --- a/pint/definitions.py +++ b/pint/definitions.py @@ -8,9 +8,12 @@ :license: BSD, see LICENSE for more details. """ +from __future__ import annotations + from collections import namedtuple +from typing import Callable, Iterable, Optional, Union -from .converters import LogarithmicConverter, OffsetConverter, ScaleConverter +from .converters import Converter, LogarithmicConverter, OffsetConverter, ScaleConverter from .errors import DefinitionSyntaxError from .util import ParserHelper, UnitsContainer, _is_dim @@ -42,7 +45,7 @@ class PreprocessedDefinition( """ @classmethod - def from_string(cls, definition): + def from_string(cls, definition: str) -> PreprocessedDefinition: name, definition = definition.split("=", 1) name = name.strip() @@ -64,7 +67,7 @@ class _NotNumeric(Exception): self.value = value -def numeric_parse(s, non_int_type=float): +def numeric_parse(s: str, non_int_type: type = float): """Try parse a string into a number (without using eval). Parameters @@ -103,7 +106,13 @@ class Definition: converter : callable or Converter or None """ - def __init__(self, name, symbol, aliases, converter): + def __init__( + self, + name: str, + symbol: Optional[str], + aliases: Iterable[str], + converter: Optional[Union[Callable, Converter]], + ): if isinstance(converter, str): raise TypeError( @@ -112,19 +121,21 @@ class Definition: self._name = name self._symbol = symbol - self._aliases = aliases + self._aliases = tuple(aliases) self._converter = converter @property - def is_multiplicative(self): + def is_multiplicative(self) -> bool: return self._converter.is_multiplicative @property - def is_logarithmic(self): + def is_logarithmic(self) -> bool: return self._converter.is_logarithmic @classmethod - def from_string(cls, definition, non_int_type=float): + def from_string( + cls, definition: Union[str, PreprocessedDefinition], non_int_type: type = float + ) -> "Definition": """Parse a definition. Parameters @@ -150,30 +161,30 @@ class Definition: return UnitDefinition.from_string(definition, non_int_type) @property - def name(self): + def name(self) -> str: return self._name @property - def symbol(self): + def symbol(self) -> str: return self._symbol or self._name @property - def has_symbol(self): + def has_symbol(self) -> bool: return bool(self._symbol) @property - def aliases(self): + def aliases(self) -> Iterable[str]: return self._aliases - def add_aliases(self, *alias): + def add_aliases(self, *alias: str) -> None: alias = tuple(a for a in alias if a not in self._aliases) self._aliases = self._aliases + alias @property - def converter(self): + def converter(self) -> Converter: return self._converter - def __str__(self): + def __str__(self) -> str: return self.name @@ -188,7 +199,9 @@ class PrefixDefinition(Definition): """ @classmethod - def from_string(cls, definition, non_int_type=float): + def from_string( + cls, definition: Union[str, PreprocessedDefinition], non_int_type: type = float + ) -> "PrefixDefinition": if isinstance(definition, str): definition = PreprocessedDefinition.from_string(definition) @@ -226,14 +239,24 @@ class UnitDefinition(Definition): """ - def __init__(self, name, symbol, aliases, converter, reference=None, is_base=False): + def __init__( + self, + name: str, + symbol: Optional[str], + aliases: Iterable[str], + converter: Converter, + reference: Optional[UnitsContainer] = None, + is_base: bool = False, + ) -> None: self.reference = reference self.is_base = is_base super().__init__(name, symbol, aliases, converter) @classmethod - def from_string(cls, definition, non_int_type=float): + def from_string( + cls, definition: Union[str, PreprocessedDefinition], non_int_type: type = float + ) -> "UnitDefinition": if isinstance(definition, str): definition = PreprocessedDefinition.from_string(definition) @@ -305,14 +328,24 @@ class DimensionDefinition(Definition): [density] = [mass] / [volume] """ - def __init__(self, name, symbol, aliases, converter, reference=None, is_base=False): + def __init__( + self, + name: str, + symbol: Optional[str], + aliases: Iterable[str], + converter: Optional[Converter], + reference: Optional[UnitsContainer] = None, + is_base: bool = False, + ) -> None: self.reference = reference self.is_base = is_base super().__init__(name, symbol, aliases, converter=None) @classmethod - def from_string(cls, definition, non_int_type=float): + def from_string( + cls, definition: Union[str, PreprocessedDefinition], non_int_type: type = float + ) -> "DimensionDefinition": if isinstance(definition, str): definition = PreprocessedDefinition.from_string(definition) @@ -350,11 +383,13 @@ class AliasDefinition(Definition): @alias meter = my_meter """ - def __init__(self, name, aliases): + def __init__(self, name: str, aliases: Iterable[str]) -> None: super().__init__(name=name, symbol=None, aliases=aliases, converter=None) @classmethod - def from_string(cls, definition, non_int_type=float): + def from_string( + cls, definition: Union[str, PreprocessedDefinition], non_int_type: type = float + ) -> AliasDefinition: if isinstance(definition, str): definition = PreprocessedDefinition.from_string(definition) |