No subject (original) (raw)


Mon Jan 18 10:37:10 CET 2010


Date: Mon, 11 Jan 2010 01:51:09 +0100 From: "Amaury Forgeot d'Arc" <amauryfa at gmail.com> To: Benjamin Peterson <benjamin at python.org> Cc: Python Dev <python-dev at python.org> Subject: Re: [Python-Dev] Data descriptor doc/implementation  inconsistency Message-ID:  <e27efe131001101651y68e1da25je2a8d02f5c62ef19 at mail.gmail.com> Content-Type: text/plain; charset=ISO-8859-1

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... 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



More information about the Python-Dev mailing list