Skip to content

Commit

Permalink
pythongh-102936: typing: document performance pitfalls of protocols d…
Browse files Browse the repository at this point in the history
…ecorated with `@runtime_checkable` (pythonGH-102937)

(cherry picked from commit 58d2b30)

Co-authored-by: Alex Waygood <[email protected]>
  • Loading branch information
AlexWaygood authored and miss-islington committed Mar 23, 2023
1 parent 1645a40 commit 924e20e
Showing 1 changed file with 18 additions and 2 deletions.
20 changes: 18 additions & 2 deletions Doc/library/typing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1582,16 +1582,32 @@ These are not used in annotations. They are building blocks for creating generic

assert isinstance(open('/some/file'), Closable)

@runtime_checkable
class Named(Protocol):
name: str

import threading
assert isinstance(threading.Thread(name='Bob'), Named)

.. note::

:func:`runtime_checkable` will check only the presence of the required
methods, not their type signatures. For example, :class:`ssl.SSLObject`
:func:`!runtime_checkable` will check only the presence of the required
methods or attributes, not their type signatures or types.
For example, :class:`ssl.SSLObject`
is a class, therefore it passes an :func:`issubclass`
check against :data:`Callable`. However, the
``ssl.SSLObject.__init__`` method exists only to raise a
:exc:`TypeError` with a more informative message, therefore making
it impossible to call (instantiate) :class:`ssl.SSLObject`.

.. note::

An :func:`isinstance` check against a runtime-checkable protocol can be
surprisingly slow compared to an ``isinstance()`` check against
a non-protocol class. Consider using alternative idioms such as
:func:`hasattr` calls for structural checks in performance-sensitive
code.

.. versionadded:: 3.8

Other special directives
Expand Down

0 comments on commit 924e20e

Please sign in to comment.