summaryrefslogtreecommitdiffstats
path: root/Doc/library
diff options
context:
space:
mode:
authorKen Jin <28750310+Fidget-Spinner@users.noreply.github.com>2021-07-24 08:53:49 (GMT)
committerGitHub <noreply@github.com>2021-07-24 08:53:49 (GMT)
commit7aac3f623610cf3dffbf548a5be5bfd4fa6790a0 (patch)
tree3e24c504baeb96ac4320827dbb8ecefdf5c92215 /Doc/library
parente89ef0ad2a299770a88ece8f7a316f7d3eb65c9f (diff)
downloadcpython-7aac3f623610cf3dffbf548a5be5bfd4fa6790a0.zip
cpython-7aac3f623610cf3dffbf548a5be5bfd4fa6790a0.tar.gz
cpython-7aac3f623610cf3dffbf548a5be5bfd4fa6790a0.tar.bz2
bpo-44353: Document that typing.NewType is now a class (#27319)
Diffstat (limited to 'Doc/library')
-rw-r--r--Doc/library/typing.rst29
1 files changed, 19 insertions, 10 deletions
diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst
index b1d67e4..8cccdc0 100644
--- a/Doc/library/typing.rst
+++ b/Doc/library/typing.rst
@@ -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.