[Python-Dev] Data descriptor doc/implementation inconsistency

Amaury Forgeot d'Arc amauryfa at gmail.com
Mon Jan 11 01:51:09 CET 2010


Hi,

2010/1/11 Benjamin Peterson <benjamin at python.org>:
> Consider this program:
>
> class Descr(object):
>    def __init__(self, name):
>        self.name = name
>    def __set__(self, instance, what):
>        instance.__dict__[self.name] = what
>
> class X(object):
>    attr = Descr("attr")
>
> x = X()
> print(x.attr)
> x.attr = 42
> print(x.attr)
>
> It gives in output:
>
> <__main__.Descr object at 0x7fe1c9b28150>
> 42
>
> The documentation [1] says that Descr is a data descriptor because it
> defines the __set__ method. It also states that data descriptors
> always override the value in the instance dictionary. So, the second
> line should also be the descriptor object according to the
> documentation.
>
> My question is: Is this a doc bug or a implementation bug? If the
> former, it will be the description of a data descriptor much less
> consistent, since it will require that a __get__ method be present,
> too. If the latter, the fix may break some programs relying on the
> ability to "cache" a value in the instance dictionary.
>
> [1] http://docs.python.org/reference/datamodel#invoking-descriptors

Quoting the documentation:
"""Normally, data descriptors define both __get__() and __set__(),
while non-data descriptors have just the __get__() method.
"""
Your example is neither a data descriptor nor a non-data descriptor...

The thing that worries me a bit is the "x.attr" returning the Descr
object. Descriptors should remain at the class level, and instance
should only see values. I'd prefer an AttributeError in this case.

-- 
Amaury Forgeot d'Arc



More information about the Python-Dev mailing list