mirror of
https://github.com/python/cpython.git
synced 2025-10-02 13:22:19 +00:00
gh-102936: typing: document performance pitfalls of protocols decorated with @runtime_checkable
(GH-102937)
(cherry picked from commit 58d2b30c01
)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
parent
1645a40b5e
commit
e2924c0ee5
1 changed files with 18 additions and 2 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue