gh-149574: Document that is_typeddict, is_protocol, is_dataclass, isclass return False for generic aliases (#149604)

This commit is contained in:
Jelle Zijlstra 2026-05-12 20:00:01 -07:00 committed by GitHub
parent 4087ff8599
commit a4e51c8dac
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 34 additions and 5 deletions

View file

@ -498,7 +498,8 @@ Module contents
.. function:: is_dataclass(obj)
Return ``True`` if its parameter is a dataclass (including subclasses of a
dataclass) or an instance of one, otherwise return ``False``.
dataclass, but not including :ref:`generic aliases <types-genericalias>`)
or an instance of one, otherwise return ``False``.
If you need to know if a class is an instance of a dataclass (and
not a dataclass itself), then add a further check for ``not

View file

@ -416,6 +416,9 @@ attributes (see :ref:`import-mod-attrs` for module attributes):
Return ``True`` if the object is a class, whether built-in or created in Python
code.
This function returns ``False`` for :ref:`generic aliases <types-genericalias>` of classes,
such as ``list[int]``.
.. function:: ismethod(object)

View file

@ -5858,7 +5858,8 @@ type and the :class:`bytes` data type:
``GenericAlias`` objects are instances of the class
:class:`types.GenericAlias`, which can also be used to create ``GenericAlias``
objects directly.
objects directly. Specializations of user-defined :ref:`generic classes <generic-classes>`
may not be instances of :class:`types.GenericAlias`, but they provide similar functionality.
.. describe:: T[X, Y, ...]

View file

@ -3633,14 +3633,27 @@ Introspection helpers
Determine if a type is a :class:`Protocol`.
For example::
For example:
.. testcode::
class P(Protocol):
def a(self) -> str: ...
b: int
is_protocol(P) # => True
is_protocol(int) # => False
assert is_protocol(P)
assert not is_protocol(int)
This function only returns true for ``Protocol`` classes, not for
:ref:`generic aliases <types-genericalias>` of them:
.. testcode::
class GenericP[T](Protocol):
def a(self) -> T: ...
b: int
assert not is_protocol(GenericP[int])
.. versionadded:: 3.13
@ -3663,6 +3676,17 @@ Introspection helpers
# not a typed dict itself
assert not is_typeddict(TypedDict)
This function only returns true for ``TypedDict`` classes, not for
:ref:`generic aliases <types-genericalias>` of them:
.. testcode::
class GenericFilm[T](TypedDict):
title: str
year: T
assert not is_typeddict(GenericFilm[int])
.. versionadded:: 3.10
.. class:: ForwardRef