Unit-Aware Type Annotations
***************************
Python supports static type analysis using the type syntax of `PEP 484
`_. For a detailed guide on type
hints, function annotations, and other related syntax see the `Real Python Guide
`_. Below we describe
how you can be use Quantity type hints and annotations and also include metadata
about the associated units.
We assume the following imports:
::
>>> import typing as T
>>> import astropy.units as u
>>> from astropy.units import Quantity
.. _quantity_type_annotation:
Quantity Type Annotation
========================
A |Quantity| can be used as a type annotation,::
>>> x: Quantity = 2 * u.km
or as a function annotation.::
>>> def func(x: Quantity) -> Quantity:
... return x
Preserving Units
^^^^^^^^^^^^^^^^
While the above annotations are useful for annotating the value's type, it
does not inform us of the other most important attribute of a |Quantity|:
the unit.
Unit information may be included by the syntax
``Quantity[unit or "physical_type", shape, numpy.dtype]``.:
..
All following doctests can be unskipped when py3.9+
.. doctest-skip::
>>> Quantity[u.m]
typing.Annotated[astropy.units.quantity.Quantity, Unit("m")]
>>>
>>> Quantity["length"]
typing.Annotated[astropy.units.quantity.Quantity, PhysicalType('length')]
See ``typing.Annotated`` for explanation of ``Annotated``
These can also be used on functions
.. doctest-skip::
>>> def func(x: Quantity[u.kpc]) -> Quantity[u.m]:
... return x << u.m
.. _multiple_annotation:
Multiple Annotations
====================
Multiple Quantity and unit-aware |Quantity| annotations are supported using
:class:`~typing.Union` or :class:`~typing.Optional`
.. doctest-skip::
>>> T.Union[Quantity[u.m], None]
typing.Optional[typing.Annotated[astropy.units.quantity.Quantity, Unit("m")]]
>>>
>>> T.Union[Quantity[u.m], Quantity["time"]]
typing.Union[typing.Annotated[astropy.units.quantity.Quantity, Unit("m")],
typing.Annotated[astropy.units.quantity.Quantity, PhysicalType('time')]]