@@ -1368,47 +1368,39 @@ These can be used as types in annotations. They all support subscription using
13681368 T1 = Annotated[int, ValueRange(-10, 5)]
13691369 T2 = Annotated[T1, ValueRange(-20, 3)]
13701370
1371- Details of the syntax:
1371+ ``Annotated `` must be subscripted with at least two arguments.
1372+ The first argument to ``Annotated `` must be a valid type. Multiple metadata
1373+ elements can be supplied as ``Annotated `` supports variadic arguments. The
1374+ order of the metadata elements is preserved and matters for equality checks::
13721375
1373- * The first argument to ``Annotated `` must be a valid type
1374-
1375- * Multiple metadata elements can be supplied (``Annotated `` supports variadic
1376- arguments)::
1377-
1378- @dataclass
1379- class ctype:
1380- kind: str
1381-
1382- Annotated[int, ValueRange(3, 10), ctype("char")]
1383-
1384- It is up to the tool consuming the annotations to decide whether the
1385- client is allowed to add multiple metadata elements to one annotation and how to
1386- merge those annotations.
1376+ @dataclass
1377+ class ctype:
1378+ kind: str
13871379
1388- * ``Annotated `` must be subscripted with at least two arguments (
1389- ``Annotated[int] `` is not valid)
1380+ Annotated[int, ValueRange(3, 10), ctype("char")]
13901381
1391- * The order of the metadata elements is preserved and matters for equality
1392- checks::
1382+ assert Annotated[int, ValueRange(3, 10), ctype("char")] != Annotated[
1383+ int, ctype("char"), ValueRange(3, 10)
1384+ ] # Order matters
13931385
1394- assert Annotated[int, ValueRange(3, 10), ctype("char")] != Annotated[
1395- int, ctype("char"), ValueRange(3, 10)
1396- ]
1386+ It is up to the tool consuming the annotations to decide whether the
1387+ client is allowed to add multiple metadata elements to one annotation and how to
1388+ merge those annotations.
13971389
1398- * Nested ``Annotated `` types are flattened. The order of the metadata elements
1399- starts with the innermost annotation::
1390+ Nested ``Annotated `` types are flattened. The order of the metadata elements
1391+ starts with the innermost annotation::
14001392
1401- assert Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[
1402- int, ValueRange(3, 10), ctype("char")
1403- ]
1393+ assert Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[
1394+ int, ValueRange(3, 10), ctype("char")
1395+ ]
14041396
1405- * Duplicated metadata elements are not removed::
1397+ Duplicated metadata elements are not removed::
14061398
1407- assert Annotated[int, ValueRange(3, 10)] != Annotated[
1408- int, ValueRange(3, 10), ValueRange(3, 10)
1409- ]
1399+ assert Annotated[int, ValueRange(3, 10)] != Annotated[
1400+ int, ValueRange(3, 10), ValueRange(3, 10)
1401+ ]
14101402
1411- * ``Annotated `` can be used with nested and generic aliases:
1403+ ``Annotated `` can be used with nested and generic aliases:
14121404
14131405 .. testcode ::
14141406
@@ -1422,19 +1414,15 @@ These can be used as types in annotations. They all support subscription using
14221414 # ``Annotated[list[tuple[int, int]], MaxLen(10)] ``:
14231415 type V = Vec[int]
14241416
1425- * ``Annotated `` cannot be used with an unpacked :class: `TypeVarTuple `::
1426-
1427- type Variadic[*Ts] = Annotated[*Ts, Ann1] # NOT valid
1417+ ``Annotated `` cannot be used with an unpacked :class: `TypeVarTuple `::
14281418
1429- This would be equivalent to::
1419+ type Variadic[*Ts] = Annotated[*Ts, Ann1] = Annotated[T1, T2, T3, ..., Ann1] # NOT valid
14301420
1431- Annotated[T1, T2, T3, ..., Ann1]
1421+ where ``T1 ``, ``T2 ``,... are :class: `TypeVars <TypeVar> `. This is invalid as
1422+ only one type should be passed to Annotated.
14321423
1433- where ``T1``, ``T2``, etc. are :class:`TypeVars <TypeVar>`. This would be
1434- invalid: only one type should be passed to Annotated.
1435-
1436- * By default, :func: `get_type_hints ` strips the metadata from annotations.
1437- Pass ``include_extras=True `` to have the metadata preserved:
1424+ By default, :func: `get_type_hints ` strips the metadata from annotations.
1425+ Pass ``include_extras=True `` to have the metadata preserved:
14381426
14391427 .. doctest ::
14401428
@@ -1446,29 +1434,23 @@ These can be used as types in annotations. They all support subscription using
14461434 >>> get_type_hints(func, include_extras = True )
14471435 {'x': typing.Annotated[int, 'metadata'], 'return': <class 'NoneType'>}
14481436
1449- * At runtime, the metadata associated with an ``Annotated `` type can be
1450- retrieved via the :attr: `!__metadata__ ` attribute:
1437+ At runtime, the metadata associated with an ``Annotated `` type can be
1438+ retrieved via the :attr: `!__metadata__ ` attribute. If you want to retrieve
1439+ the original type wrapped by ``Annotated ``, use the :attr: `!__origin__ ` attribute:
14511440
14521441 .. doctest ::
14531442
1454- >>> from typing import Annotated
1443+ >>> from typing import Annotated, get_origin
14551444 >>> X = Annotated[int , " very" , " important" , " metadata" ]
14561445 >>> X
14571446 typing.Annotated[int, 'very', 'important', 'metadata']
14581447 >>> X.__metadata__
14591448 ('very', 'important', 'metadata')
1460-
1461- * At runtime, if you want to retrieve the original
1462- type wrapped by ``Annotated ``, use the :attr: `!__origin__ ` attribute:
1463-
1464- .. doctest ::
1465-
1466- >>> from typing import Annotated, get_origin
14671449 >>> Password = Annotated[str , " secret" ]
14681450 >>> Password.__origin__
14691451 <class 'str'>
14701452
1471- Note that using :func: `get_origin ` will return ``Annotated `` itself:
1453+ Note that using :func: `get_origin ` will return ``Annotated `` itself:
14721454
14731455 .. doctest ::
14741456
0 commit comments