T1 = Annotated[int, ValueRange(-10, 5)]
T2 = Annotated[T1, ValueRange(-20, 3)]
- Details of the syntax:
+ The first argument to ``Annotated`` must be a valid type. Multiple metadata
+ elements can be supplied as ``Annotated`` supports variadic arguments. The
+ order of the metadata elements is preserved and matters for equality checks::
- * The first argument to ``Annotated`` must be a valid type
-
- * Multiple metadata elements can be supplied (``Annotated`` supports variadic
- arguments)::
-
- @dataclass
- class ctype:
- kind: str
-
- Annotated[int, ValueRange(3, 10), ctype("char")]
-
- It is up to the tool consuming the annotations to decide whether the
- client is allowed to add multiple metadata elements to one annotation and how to
- merge those annotations.
+ @dataclass
+ class ctype:
+ kind: str
- * ``Annotated`` must be subscripted with at least two arguments (
- ``Annotated[int]`` is not valid)
+ a1 = Annotated[int, ValueRange(3, 10), ctype("char")]
+ a2 = Annotated[int, ctype("char"), ValueRange(3, 10)]
- * The order of the metadata elements is preserved and matters for equality
- checks::
+ assert a1 != a2 # Order matters
- assert Annotated[int, ValueRange(3, 10), ctype("char")] != Annotated[
- int, ctype("char"), ValueRange(3, 10)
- ]
+ It is up to the tool consuming the annotations to decide whether the
+ client is allowed to add multiple metadata elements to one annotation and how to
+ merge those annotations.
- * Nested ``Annotated`` types are flattened. The order of the metadata elements
- starts with the innermost annotation::
+ Nested ``Annotated`` types are flattened. The order of the metadata elements
+ starts with the innermost annotation::
- assert Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[
- int, ValueRange(3, 10), ctype("char")
- ]
+ assert Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[
+ int, ValueRange(3, 10), ctype("char")
+ ]
- * Duplicated metadata elements are not removed::
+ Duplicated metadata elements are not removed::
- assert Annotated[int, ValueRange(3, 10)] != Annotated[
- int, ValueRange(3, 10), ValueRange(3, 10)
- ]
+ assert Annotated[int, ValueRange(3, 10)] != Annotated[
+ int, ValueRange(3, 10), ValueRange(3, 10)
+ ]
- * ``Annotated`` can be used with nested and generic aliases:
+ ``Annotated`` can be used with nested and generic aliases:
.. testcode::
# ``Annotated[list[tuple[int, int]], MaxLen(10)]``:
type V = Vec[int]
- * ``Annotated`` cannot be used with an unpacked :class:`TypeVarTuple`::
-
- type Variadic[*Ts] = Annotated[*Ts, Ann1] # NOT valid
-
- This would be equivalent to::
+ ``Annotated`` cannot be used with an unpacked :class:`TypeVarTuple`::
- Annotated[T1, T2, T3, ..., Ann1]
+ type Variadic[*Ts] = Annotated[*Ts, Ann1] = Annotated[T1, T2, T3, ..., Ann1] # NOT valid
- where ``T1``, ``T2``, etc. are :class:`TypeVars <TypeVar>`. This would be
- invalid: only one type should be passed to Annotated.
+ where ``T1``, ``T2``, ... are :class:`TypeVars <TypeVar>`. This is invalid as
+ only one type should be passed to Annotated.
- * By default, :func:`get_type_hints` strips the metadata from annotations.
- Pass ``include_extras=True`` to have the metadata preserved:
+ By default, :func:`get_type_hints` strips the metadata from annotations.
+ Pass ``include_extras=True`` to have the metadata preserved:
.. doctest::
>>> get_type_hints(func, include_extras=True)
{'x': typing.Annotated[int, 'metadata'], 'return': <class 'NoneType'>}
- * At runtime, the metadata associated with an ``Annotated`` type can be
- retrieved via the :attr:`!__metadata__` attribute:
+ At runtime, the metadata associated with an ``Annotated`` type can be
+ retrieved via the :attr:`!__metadata__` attribute:
.. doctest::
>>> X.__metadata__
('very', 'important', 'metadata')
- * At runtime, if you want to retrieve the original
- type wrapped by ``Annotated``, use the :attr:`!__origin__` attribute:
+ If you want to retrieve the original type wrapped by ``Annotated``, use the
+ :attr:`!__origin__` attribute:
.. doctest::
>>> Password.__origin__
<class 'str'>
- Note that using :func:`get_origin` will return ``Annotated`` itself:
+ Note that using :func:`get_origin` will return ``Annotated`` itself:
.. doctest::