On 13 Sep, 2013, at 14:23, Steven D'Aprano <st...@pearwood.info> wrote:
> On Fri, Sep 13, 2013 at 08:42:46PM +1000, Nick Coghlan wrote: >> Perhaps "__getdescriptor__" would work as the method name? Yes, it can >> technically return a non-descriptor, > > So technically that name is, um, what's the term... oh yes, "a lie". > > :-) > > >> but the *primary* purpose is to >> customise the retrieval of objects that will be checked to see if they're >> descriptors. > > If that's the case, the PEP should make that clear. > > [Aside: the PEP states that the method shouldn't invoke descriptors. > What's the reason for that? If I take the statement literally, doesn't > it mean that the method mustn't use any other methods at all? Surely > that can't be what is intended, but I'm not sure what is intended.] What it tries to say is that even if cls.__dict__[name] is a descriptor the __locallookup__ method should not call its __get__ method. That was more relevant when __locallookup__ had access to the object for which method resolution was performed. I'm pretty sure this muddies the water even further, but don't have a clearer description at the moment. > > >> It *won't* be invoked when looking for ordinary attributes in >> an instance dict, but *will* be invoked when looking on the class object. > > Just to be clear, if I have: > > instance = MyClass() > x = instance.name > > and "name" is found in instance.__dict__, then this special method will > not be invoked. But if "name" is not found in the instance dict, then > "name" will be looked up on the class object MyClass, which may invoke > this special method. Am I correct? No. This special method will always be called when "instance.__getattribute__" eventually calls PyObject_GenericGetAttribute (otherwise all bets are off). PyObject_GenericGetAttribute always looks for a candicate descriptor in the class (or one of the other classes on the MRO). When a candidate descriptor is found, and this is a data descriptor the descriptor is used instead of the value from instance.__dict__ (otherwise the value from instance.__dict__ is used). Ronald _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com