gh-149574: Document that is_typeddict, is_protocol, is_dataclass, isclass return False for generic aliases (GH-149604)
(cherry picked from commit
a4e51c8dac9fdd49ae26ff8c6cd3c808fd8ba15e)
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
.. 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
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)
``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, ...]
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
# 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