[Python-Dev] PEP 447: add type.__locallookup__
ronaldoussoren at mac.com
Thu Sep 19 10:50:48 CEST 2013
On 13 Sep, 2013, at 14:23, Steven D'Aprano <steve at 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
> 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).
More information about the Python-Dev