[Python-Dev] Data descriptor doc/implementation inconsistency

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


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