Skip to content

Commit

Permalink
WIP pint typing
Browse files Browse the repository at this point in the history
- Add typing module for type Alias
- Add py.typed for PEP561 supports
- Add overloaded signature for __new__ Quantity
- Quantity as Generic class
- Add type hints throughout the project
- Add py.typed in package data in setup.cfg
  • Loading branch information
jules-ch committed May 22, 2021
1 parent cdf0a50 commit abc29be
Show file tree
Hide file tree
Showing 9 changed files with 331 additions and 168 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ Pint Changelog

- Implement use of Quantity in the Quantity constructor (convert to specified units).
(Issue #1231)
- Add supports for type hints for Quantity class. Quantity is now a Generic (PEP560).
- Add support for [PEP561](https://www.python.org/dev/peps/pep-0561/) (Package Type information)


0.17 (2021-03-22)
Expand Down
77 changes: 55 additions & 22 deletions pint/definitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
"""

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

Expand Down Expand Up @@ -42,7 +43,7 @@ class PreprocessedDefinition(
"""

@classmethod
def from_string(cls, definition):
def from_string(cls, definition: str) -> "PreprocessedDefinition":
name, definition = definition.split("=", 1)
name = name.strip()

Expand All @@ -64,7 +65,7 @@ def __init__(self, value):
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
Expand Down Expand Up @@ -103,7 +104,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(
Expand All @@ -112,19 +119,21 @@ def __init__(self, name, symbol, aliases, converter):

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
Expand All @@ -150,30 +159,30 @@ def from_string(cls, definition, non_int_type=float):
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


Expand All @@ -188,7 +197,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)

Expand Down Expand Up @@ -226,14 +237,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)

Expand Down Expand Up @@ -305,14 +326,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: 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)

Expand Down Expand Up @@ -350,11 +381,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)
Expand Down
Empty file added pint/py.typed
Empty file.
Loading

0 comments on commit abc29be

Please sign in to comment.