bpo-44353: Document that typing.NewType is now a class (#27319)

This commit is contained in:
Ken Jin 2021-07-24 16:53:49 +08:00 committed by GitHub
parent e89ef0ad2a
commit 7aac3f6236
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -77,7 +77,7 @@ Note that ``None`` as a type hint is a special case and is replaced by
NewType
=======
Use the :func:`NewType` helper function to create distinct types::
Use the :class:`NewType` helper class to create distinct types::
from typing import NewType
@ -106,15 +106,14 @@ accidentally creating a ``UserId`` in an invalid way::
Note that these checks are enforced only by the static type checker. At runtime,
the statement ``Derived = NewType('Derived', Base)`` will make ``Derived`` a
function that immediately returns whatever parameter you pass it. That means
class that immediately returns whatever parameter you pass it. That means
the expression ``Derived(some_value)`` does not create a new class or introduce
any overhead beyond that of a regular function call.
much overhead beyond that of a regular function call.
More precisely, the expression ``some_value is Derived(some_value)`` is always
true at runtime.
This also means that it is not possible to create a subtype of ``Derived``
since it is an identity function at runtime, not an actual type::
It is invalid to create a subtype of ``Derived``::
from typing import NewType
@ -123,7 +122,7 @@ since it is an identity function at runtime, not an actual type::
# Fails at runtime and does not typecheck
class AdminUserId(UserId): pass
However, it is possible to create a :func:`NewType` based on a 'derived' ``NewType``::
However, it is possible to create a :class:`NewType` based on a 'derived' ``NewType``::
from typing import NewType
@ -151,6 +150,12 @@ See :pep:`484` for more details.
.. versionadded:: 3.5.2
.. versionchanged:: 3.10.0
``NewType`` is now a class rather than a function. There is some additional
runtime cost when calling ``NewType`` over a regular function. However, this
cost will be reduced in 3.11.0.
Callable
========
@ -1306,17 +1311,21 @@ These are not used in annotations. They are building blocks for declaring types.
Removed the ``_field_types`` attribute in favor of the more
standard ``__annotations__`` attribute which has the same information.
.. function:: NewType(name, tp)
.. class:: NewType(name, tp)
A helper function to indicate a distinct type to a typechecker,
see :ref:`distinct`. At runtime it returns a function that returns
its argument. Usage::
A helper class to indicate a distinct type to a typechecker,
see :ref:`distinct`. At runtime it returns an object that returns
its argument when called.
Usage::
UserId = NewType('UserId', int)
first_user = UserId(1)
.. versionadded:: 3.5.2
.. versionchanged:: 3.10.0
``NewType`` is now a class rather than a function.
.. class:: TypedDict(dict)
Special construct to add type hints to a dictionary.