homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Harmonizing descriptor protocol documentation
Type: enhancement Stage: resolved
Components: Documentation Versions: Python 3.2, Python 3.3, Python 3.4, Python 3.5, Python 2.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: rhettinger Nosy List: Jay.Parlar, daniel.urban, davide.rizzo, docs@python, eric.araujo, ezio.melotti, franck, martin.panter, nedbat, rhettinger
Priority: low Keywords: patch

Created on 2011年05月14日 13:56 by davide.rizzo, last changed 2022年04月11日 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
12077_descriptor_howto_python3.patch franck, 2013年02月11日 17:37 Patch for python 3 doc review
12077_descriptor_howto_python2.patch franck, 2013年02月11日 17:38 Patch for python 2 doc review
Messages (8)
msg135974 - (view) Author: Davide Rizzo (davide.rizzo) * Date: 2011年05月14日 13:56
There are three sources of information for the descriptor protocol:
- Data model reference (Doc/reference/datamodel.rst)
- Descriptor HowTo guide (Doc/howto/descriptor.rst)
- PEP 252
A developer who already knows descriptor tipically reads the first one:
object.__get__(self, instance, owner) "... owner is always the owner class ..."
Reading a bit further there are the ways a descriptor can be called, and the "direct call" is x.__get__(a). That is, without the third argument (owner) specified.
The how-to definition is slightly different:
descr.__get__(self, obj, type=None) --> value
Here the arguments have different names ("type" shadowing the type bultin) and it seems to be implied that the third argument is optional. The ClassMethod example at the end of the document seems to confirm this:
def __get__(self, obj, klass=None):
(though another example doesn't).
And the method contains an explicit check on klass being None.
Also it could be confusing that through the examples in the same document many different names are used for the same argument (type, objtype, klass), and all different than the name used in the reference.
Lastly the PEP is more explicit:
__get__(): a function callable with one or two arguments. [...] When X is None, the optional second argument, T, should be meta-object. [...] When both X and T are specified ...
One more quirk: the reference explains the distinction between data and non-data descriptors, though says nothing about __set__ raising AttributeError for read-only data descriptors.
My proposal:
- use the same names for __get__ arguments throughout the documentation (both the reference and the tutorial), e.g. __get__(self, instance, owner)
- decide whether the third argument should be optional, or state the common usage in the reference, and fix accordingly the examples in the howto
- explain data, non-data and read-only descriptors in the __set__ reference, or more simply, how the defintion of __set__ affects these things.
msg136172 - (view) Author: Jay Parlar (Jay.Parlar) Date: 2011年05月17日 18:17
While working on this, I believe it would also make sense to remove all instances of the terms "new-style" and "old-style" from the Descriptor HowTo (and wherever else they might be present)
It still makes sense for them to be present in the 2.7 documentation, but they're concepts that don't exist in 3.x
msg136295 - (view) Author: Jay Parlar (Jay.Parlar) Date: 2011年05月19日 14:16
Another problem is that the examples and text in the section "Functions and Methods" is no longer correct in 3.x. Namely the the references to unbound methods, and the example showing an unbound method being returned when accessing a method of a class.
msg181915 - (view) Author: Franck Michea (franck) * Date: 2013年02月11日 17:37
Here is at least a correction of Descriptors' HowTo. There are two versions since some stuff differs (object inheritance, ...).
Here are some of my interrogations though:
 - RevealAccess is not using instance parameter, so value is shared. Is this intended?
 - Don't really know what to do with "Function and Methods" part. First I don't really understand the relevance of this in a descriptor how-to. Also it is know outdated in python3 version (unbound thing, ...), so what do?
 - In __getattribute__ function, I don't really understand the paramters given to __get__, why None and the instance? But this is probably my fault.
This also doesn't answer the question about the real source that should be kept. What to do?
I also need a proof-read, since english is not my first language... Anyway it's clearly not enough to be published like that
Have a nice day!
msg293161 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2017年05月06日 14:16
See Issue 23702 specifically about unbound methods in Python 3, and Issue 25435 about general problems with the how-to in Python 3.
msg293164 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2017年05月06日 15:16
I will have a chance to work on this before long.
msg350724 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2019年08月29日 06:07
[Davide]
> - use the same names for __get__ arguments throughout 
> the documentation (both the reference and the tutorial),
> e.g. __get__(self, instance, owner)
Early on the choice of variable names diverged (including in various PEPs and in the C source). I will harmonize where I can but the cat is out of the bag.
> - decide whether the third argument should be optional, 
> or state the common usage in the reference, and fix 
> accordingly the examples in the howto
PEP 252 specifies that it is optional. Various builtin descriptors also make it optional (function_get, staticmethod_get, classmethod_get, and property_get).
I'm fixing the main docs and non-compliant code in PR 12992
> explain data, non-data and read-only descriptors in 
> the __set__ reference, or more simply, how the >
> defintion of __set__ affects these things.
That is reasonable. Will add to the datamodel docs.
[Jay Parlar]
> Another problem is that the examples and text in 
> the section "Functions and Methods" is no longer 
> correct in 3.x. Namely the the references to
> unbound methods
That was fixed a good while ago.
msg350728 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2019年08月29日 06:22
See PR 12992 for the cross-reference from the __set__ docs to the section covering data and non-data descriptors.
History
Date User Action Args
2022年04月11日 14:57:17adminsetgithub: 56286
2019年08月29日 08:29:30rhettingersetstatus: open -> closed
resolution: fixed
stage: needs patch -> resolved
2019年08月29日 06:22:12rhettingersetmessages: + msg350728
2019年08月29日 06:07:50rhettingersetmessages: + msg350724
2017年05月20日 09:35:51martin.panterlinkissue20751 dependencies
2017年05月06日 15:16:26rhettingersetmessages: + msg293164
2017年05月06日 14:16:47martin.pantersetnosy: + martin.panter
messages: + msg293161
2013年05月03日 18:41:12nedbatsetnosy: + nedbat
2013年05月03日 09:48:34rhettingersetpriority: normal -> low
assignee: rhettinger
2013年02月12日 08:25:53rhettingersetassignee: rhettinger -> (no value)
2013年02月11日 17:38:18francksetfiles: + 12077_descriptor_howto_python2.patch
2013年02月11日 17:37:59francksetfiles: + 12077_descriptor_howto_python3.patch
versions: + Python 3.5
nosy: + franck

messages: + msg181915

keywords: + patch
2012年11月08日 08:37:48ezio.melottisettype: enhancement
versions: + Python 3.4
2011年05月23日 14:41:31eric.araujosetnosy: + eric.araujo
2011年05月19日 14:16:48Jay.Parlarsetmessages: + msg136295
2011年05月17日 18:17:19Jay.Parlarsetnosy: + Jay.Parlar
messages: + msg136172
2011年05月17日 05:16:58daniel.urbansetnosy: + daniel.urban
2011年05月17日 02:08:01rhettingersetassignee: docs@python -> rhettinger

nosy: + rhettinger
2011年05月16日 11:45:58ezio.melottisetnosy: + ezio.melotti

stage: needs patch
2011年05月14日 13:56:25davide.rizzocreate

AltStyle によって変換されたページ (->オリジナル) /