Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve documentation for typing.get_type_hints #119928

Merged
merged 4 commits into from
Jun 2, 2024
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 25 additions & 26 deletions Doc/library/typing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3080,35 +3080,34 @@ Introspection helpers
Return a dictionary containing type hints for a function, method, module
or class object.

This is often the same as ``obj.__annotations__``. In addition,
forward references encoded as string literals are handled by evaluating
them in ``globals``, ``locals`` and (where applicable)
:ref:`type parameter <type-params>` namespaces.
For a class ``C``, return
a dictionary constructed by merging all the ``__annotations__`` along
``C.__mro__`` in reverse order.

The function recursively replaces all ``Annotated[T, ...]`` with ``T``,
unless ``include_extras`` is set to ``True`` (see :class:`Annotated` for
more information). For example:
JelleZijlstra marked this conversation as resolved.
Show resolved Hide resolved

.. testcode::

class Student(NamedTuple):
name: Annotated[str, 'some marker']

assert get_type_hints(Student) == {'name': str}
assert get_type_hints(Student, include_extras=False) == {'name': str}
assert get_type_hints(Student, include_extras=True) == {
'name': Annotated[str, 'some marker']
}
This is often the same as ``obj.__annotations__``, but this function makes
the following changes to the annotations dictionary:

* Forward references encoded as string literals or :class:`ForwardRef` objects
are handled by evaluating them in *globalns*, *localns*, and (where applicable)
*obj*'s :ref:`type parameter <type-params>` namespace. If *globalns* or
*localns* is not given, appropriate namespace dictionaries are inferred
from *obj*.
* ``None`` is replaced with :class:`types.NoneType`.
* If :func:`@no_type_check <no_type_check>` has been applied to *obj*, an empty dictionary is
returned.
* If *obj* is a class ``C``, the function returns a dictionary that merges
annotations from ``C``'s base classes with those on ``C`` directly. This
is done by traversing ``C.__mro__`` and iteratively combining
``__annotations__`` dictionaries. Annotations on classes appearing
earlier in the :term:`method resolution order` always take precedence over
annotations on classes appearing later in the method resolution order.
JelleZijlstra marked this conversation as resolved.
Show resolved Hide resolved

See also :func:`inspect.get_annotations`, a lower-level function that
returns annotations more directly.

.. note::

:func:`get_type_hints` does not work with imported
:ref:`type aliases <type-aliases>` that include forward references.
Enabling postponed evaluation of annotations (:pep:`563`) may remove
the need for most forward references.
If any forward references in the annotations of *obj* are not resolvable
or are not valid Python code, this function will raise an exception
such as :exc:`NameError`. For example, this can happen with imported
:ref:`type aliases <type-aliases>` that include forward references,
or with names imported under :data:`if TYPE_CHECKING <TYPE_CHECKING>`.

.. versionchanged:: 3.9
Added ``include_extras`` parameter as part of :pep:`593`.
Expand Down
Loading