Skip to content

Commit

Permalink
pythongh-122102: Fix/improve docs of `inspect.is{data,method}descript…
Browse files Browse the repository at this point in the history
…or()`
  • Loading branch information
zuo committed Jul 22, 2024
1 parent 0dcbc83 commit 2a11629
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 14 deletions.
41 changes: 27 additions & 14 deletions Doc/library/inspect.rst
Original file line number Diff line number Diff line change
Expand Up @@ -513,19 +513,18 @@ attributes (see :ref:`import-mod-attrs` for module attributes):
.. function:: ismethoddescriptor(object)

Return ``True`` if the object is a method descriptor, but not if
:func:`ismethod`, :func:`isclass`, :func:`isfunction` or :func:`isbuiltin`
are true.
:func:`isclass`, :func:`ismethod` or :func:`isfunction` are true.

This, for example, is true of ``int.__add__``. An object passing this test
has a :meth:`~object.__get__` method, but not a :meth:`~object.__set__`
method or a :meth:`~object.__delete__` method. Beyond that, the set of
attributes varies. A :attr:`~definition.__name__` attribute is usually
sensible, and :attr:`!__doc__` often is.

Methods implemented via descriptors that also pass one of the other tests
return ``False`` from the :func:`ismethoddescriptor` test, simply because the
other tests promise more -- you can, e.g., count on having the
:attr:`~method.__func__` attribute (etc) when an object passes
Method descriptors that also pass any of the other tests mentioned above
(:func:`isclass`, :func:`ismethod` or :func:`isfunction`) make this function
return ``False``, simply because the other tests promise more -- you can, e.g.,
count on having the :attr:`~method.__func__` attribute when an object passes
:func:`ismethod`.

.. versionchanged:: 3.13
Expand All @@ -536,15 +535,29 @@ attributes (see :ref:`import-mod-attrs` for module attributes):

.. function:: isdatadescriptor(object)

Return ``True`` if the object is a data descriptor.
Return ``True`` if the object is a data descriptor, but not if
:func:`isclass`, :func:`ismethod` or :func:`isfunction` are true.

Data descriptors have a :attr:`~object.__set__` or a :attr:`~object.__delete__` method.
Examples are properties (defined in Python), getsets, and members. The
latter two are defined in C and there are more specific tests available for
those types, which is robust across Python implementations. Typically, data
descriptors will also have :attr:`~definition.__name__` and :attr:`!__doc__` attributes
(properties, getsets, and members have both of these attributes), but this is
not guaranteed.
Data descriptors always have a :meth:`~object.__set__` method and/or
a :meth:`~object.__delete__` method. Optionally, they may also have a
:meth:`~object.__get__` method.

Examples of data descriptors are properties (see: :func:`property`), getset
descriptors and member descriptors. Note that for the latter two (which can
be defined only at the C level, in extension modules) more specific tests
are available: :func:`isgetsetdescriptor` and :func:`ismemberdescriptor`,
respectively.

Typically, data descriptors have also :attr:`~definition.__name__` and
:attr:`!__doc__` attributes (properties, getsets and member descriptors have
them), but this is not guaranteed.

.. versionchanged:: 3.8
Now this function reports objects with only a :meth:`~object.__set__` method
as being data descriptors (the presence of :meth:`~object.__get__` is no
longer required for that). Moreover, objects with :meth:`~object.__delete__`,
but not :meth:`~object.__set__`, are now properly recognized as data
descriptors as well (formerly, they were not).


.. function:: isgetsetdescriptor(object)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix and improve the descriptions (and docstrings) of
:func:`inspect.ismethoddescriptor` and :func:`inspect.isdatadescriptor`.
Patch by Jan Kaliszewski.

0 comments on commit 2a11629

Please sign in to comment.