-
-
Notifications
You must be signed in to change notification settings - Fork 32.1k
gh-122102: Fix/improve docs of descriptor-related tools in inspect
#122104
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 2 commits
2a11629
e0ba39d
b59b533
8aa2934
f8ad14d
53077a8
db0bd35
31fdce2
5351773
cb2e360
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -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 | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's a bit weird to say "mentioned above" and re-mention them. Either you mention them again (which I wouldn't suggest) or you just say "mentioned above". |
||||||||||||||||||
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 | ||||||||||||||||||
|
@@ -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 | ||||||||||||||||||
zuo marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||
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. | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I find the fragment about those two specific tests being robust across different Python implementations quite problematic: in a way, those two tests can be considered less robust across different Python implementations. (If I needed a test returning true for, e.g., a frame's That's why I propose to remove that fragment. IMHO, it causes more confusion than good. Also I believe that the statement that those two tests are more specific, together with the docs of those two tests themselves, convey enough information. |
||||||||||||||||||
|
||||||||||||||||||
Typically, data descriptors have also :attr:`~definition.__name__` and | ||||||||||||||||||
:attr:`!__doc__` attributes (properties, getsets and member descriptors have | ||||||||||||||||||
them), but this is not guaranteed. | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe that the fragment referring to properties, getsets or member descriptors should remain in parentheses, as it conveys here only additional (extra) information, not the crucial one (which is that, in general, the presence of the data descriptors' attributes |
||||||||||||||||||
|
||||||||||||||||||
.. versionchanged:: 3.8 | ||||||||||||||||||
picnixz marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||
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). | ||||||||||||||||||
|
||||||||||||||||||
zuo marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||
|
||||||||||||||||||
.. function:: isgetsetdescriptor(object) | ||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
Fix and improve the descriptions (and docstrings) of | ||
zuo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
:func:`inspect.ismethoddescriptor` and :func:`inspect.isdatadescriptor`. | ||
Patch by Jan Kaliszewski. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we say "X, Y or Z is true" or "X, Y or Z are true"? @python/proofreaders