[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