> Date: Mon, 11 Jan 2010 01:51:09 +0100
> From: "Amaury Forgeot d'Arc" <amaur...@gmail.com>
> To: Benjamin Peterson <benja...@python.org>
> Cc: Python Dev <python-dev@python.org>
> Subject: Re: [Python-Dev] Data descriptor doc/implementation
>        inconsistency
> Message-ID:
>        <e27efe131001101651y68e1da25je2a8d02f5c62e...@mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
>
> Hi,
>
> 2010/1/11 Benjamin Peterson <benja...@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...
Actually, there is this footnote [1]:

""" A descriptor can define any combination of __get__(), __set__()
and __delete__(). If it does not define __get__(), then accessing the
attribute even on an instance will return the descriptor object
itself. If the descriptor defines __set__() and/or __delete__(), it is
a data descriptor; if it defines neither, it is a non-data descriptor.
"""

Which would mean Descr is actually a data descriptor without a
__get__(), so x.attr should always return the descriptor object itself
(at least in the docs).

> 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

[1] http://docs.python.org/reference/datamodel#id7
-- 
Lukasz Rekucki
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to