Skip to content

Commit 7101803

Browse files
zschaller27ZacharySchaller
andauthored
Allow pint.registry.Quantity to be used as a generic class (#2231)
* Generic quantity * Added note to CHANGES * Added parameterized Quantity type to UnitRegistry class definition. * Fixed linting issues --------- Co-authored-by: ZacharySchaller <[email protected]>
1 parent 5e5104d commit 7101803

File tree

10 files changed

+36
-32
lines changed

10 files changed

+36
-32
lines changed

CHANGES

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Pint Changelog
88
- Add devcontainer.json to add GitHub Codespace support (#2208)
99
- Add support for `numpy.geomspace` (#2206)
1010
- Add support for `linalg.diagonal`, `linalg.matrix_transpose`, `diag`, `tril`, `triu`, `linalg.eigvals`, `linalg.eigvalsh`, `linalg.matrix_norm` and `linalg.vector_norm` (#2210)
11-
11+
- Add support for `pint.Quantity` being used as Generic.
1212

1313
0.25.0 (2025-08-25)
1414
-------------------

pint/facets/context/registry.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ def _get_compatible_units(
427427

428428

429429
class ContextRegistry(
430-
GenericContextRegistry[objects.ContextQuantity[Any], objects.ContextUnit]
430+
GenericContextRegistry[objects.ContextQuantity, objects.ContextUnit]
431431
):
432-
Quantity: TypeAlias = objects.ContextQuantity[Any]
432+
Quantity: TypeAlias = objects.ContextQuantity
433433
Unit: TypeAlias = objects.ContextUnit

pint/facets/dask/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from __future__ import annotations
1212

1313
import functools
14-
from typing import Any, Generic
14+
from typing import Generic
1515

1616
from ...compat import TypeAlias, compute, dask_array, persist, visualize
1717
from ..plain import (
@@ -136,6 +136,6 @@ class GenericDaskRegistry(
136136
pass
137137

138138

139-
class DaskRegistry(GenericDaskRegistry[DaskQuantity[Any], DaskUnit]):
140-
Quantity: TypeAlias = DaskQuantity[Any]
139+
class DaskRegistry(GenericDaskRegistry[DaskQuantity, DaskUnit]):
140+
Quantity: TypeAlias = DaskQuantity
141141
Unit: TypeAlias = DaskUnit

pint/facets/measurement/registry.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from __future__ import annotations
1010

11-
from typing import Any, Generic
11+
from typing import Generic
1212

1313
from ...compat import TypeAlias, ufloat
1414
from ...util import create_class_with_registry
@@ -38,9 +38,7 @@ def no_uncertainties(*args, **kwargs):
3838

3939

4040
class MeasurementRegistry(
41-
GenericMeasurementRegistry[
42-
objects.MeasurementQuantity[Any], objects.MeasurementUnit
43-
]
41+
GenericMeasurementRegistry[objects.MeasurementQuantity, objects.MeasurementUnit]
4442
):
45-
Quantity: TypeAlias = objects.MeasurementQuantity[Any]
43+
Quantity: TypeAlias = objects.MeasurementQuantity
4644
Unit: TypeAlias = objects.MeasurementUnit

pint/facets/nonmultiplicative/registry.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,8 @@ def _convert(
302302

303303
class NonMultiplicativeRegistry(
304304
GenericNonMultiplicativeRegistry[
305-
objects.NonMultiplicativeQuantity[Any], objects.NonMultiplicativeUnit
305+
objects.NonMultiplicativeQuantity, objects.NonMultiplicativeUnit
306306
]
307307
):
308-
Quantity: TypeAlias = objects.NonMultiplicativeQuantity[Any]
308+
Quantity: TypeAlias = objects.NonMultiplicativeQuantity
309309
Unit: TypeAlias = objects.NonMultiplicativeUnit

pint/facets/numpy/registry.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from __future__ import annotations
1010

11-
from typing import Any, Generic
11+
from typing import Generic
1212

1313
from ...compat import TypeAlias
1414
from ..plain import GenericPlainRegistry, QuantityT, UnitT
@@ -22,6 +22,6 @@ class GenericNumpyRegistry(
2222
pass
2323

2424

25-
class NumpyRegistry(GenericPlainRegistry[NumpyQuantity[Any], NumpyUnit]):
26-
Quantity: TypeAlias = NumpyQuantity[Any]
25+
class NumpyRegistry(GenericPlainRegistry[NumpyQuantity, NumpyUnit]):
26+
Quantity: TypeAlias = NumpyQuantity
2727
Unit: TypeAlias = NumpyUnit

pint/facets/plain/registry.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def __call__(self, *args: Any, **kwargs: Any):
160160

161161

162162
# Generic types used to mark types associated to Registries.
163-
QuantityT = TypeVar("QuantityT", bound=PlainQuantity[Any])
163+
QuantityT = TypeVar("QuantityT", bound=PlainQuantity)
164164
UnitT = TypeVar("UnitT", bound=PlainUnit)
165165

166166

@@ -1476,6 +1476,6 @@ def UnitsContainer(self, *args: Any, **kwargs: Any) -> UnitsContainer:
14761476
__call__ = parse_expression
14771477

14781478

1479-
class PlainRegistry(GenericPlainRegistry[PlainQuantity[Any], PlainUnit]):
1480-
Quantity: TypeAlias = PlainQuantity[Any]
1479+
class PlainRegistry(GenericPlainRegistry[PlainQuantity, PlainUnit]):
1480+
Quantity: TypeAlias = PlainQuantity
14811481
Unit: TypeAlias = PlainUnit

pint/facets/system/registry.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from __future__ import annotations
1010

1111
from numbers import Number
12-
from typing import TYPE_CHECKING, Any, Generic
12+
from typing import TYPE_CHECKING, Generic
1313

1414
from ... import errors
1515
from ...compat import TypeAlias
@@ -258,8 +258,6 @@ def _get_compatible_units(
258258
raise ex
259259

260260

261-
class SystemRegistry(
262-
GenericSystemRegistry[objects.SystemQuantity[Any], objects.SystemUnit]
263-
):
264-
Quantity: TypeAlias = objects.SystemQuantity[Any]
261+
class SystemRegistry(GenericSystemRegistry[objects.SystemQuantity, objects.SystemUnit]):
262+
Quantity: TypeAlias = objects.SystemQuantity
265263
Unit: TypeAlias = objects.SystemUnit

pint/registry.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,14 @@
2626

2727

2828
class Quantity(
29-
facets.SystemRegistry.Quantity,
30-
facets.ContextRegistry.Quantity,
31-
facets.DaskRegistry.Quantity,
32-
facets.NumpyRegistry.Quantity,
33-
facets.MeasurementRegistry.Quantity,
34-
facets.NonMultiplicativeRegistry.Quantity,
35-
facets.PlainRegistry.Quantity,
29+
Generic[facets.MagnitudeT],
30+
facets.SystemRegistry.Quantity[facets.MagnitudeT],
31+
facets.ContextRegistry.Quantity[facets.MagnitudeT],
32+
facets.DaskRegistry.Quantity[facets.MagnitudeT],
33+
facets.NumpyRegistry.Quantity[facets.MagnitudeT],
34+
facets.MeasurementRegistry.Quantity[facets.MagnitudeT],
35+
facets.NonMultiplicativeRegistry.Quantity[facets.MagnitudeT],
36+
facets.PlainRegistry.Quantity[facets.MagnitudeT],
3637
):
3738
pass
3839

@@ -62,7 +63,7 @@ class GenericUnitRegistry(
6263
pass
6364

6465

65-
class UnitRegistry(GenericUnitRegistry[Quantity, Unit]):
66+
class UnitRegistry(GenericUnitRegistry[Quantity[facets.MagnitudeT], Unit]):
6667
"""The unit registry stores the definitions and relationships between units.
6768
6869
Parameters

pint/testsuite/test_quantity.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2062,3 +2062,10 @@ def test_types(self):
20622062
assert isinstance(quantity.m, float)
20632063

20642064
assert isinstance(self.ureg.m, self.ureg.Unit)
2065+
2066+
2067+
class TestGenericQuantityTyping:
2068+
def test_generic_type_use(self):
2069+
from pint import Quantity
2070+
2071+
_ = Quantity[int]

0 commit comments

Comments
 (0)