[Python-Dev] special method lookup: how much do we care?

Benjamin Peterson benjamin at python.org
Sat May 9 03:52:24 CEST 2009


2009/5/8 Terry Reedy <tjreedy at udel.edu>:
> Benjamin Peterson wrote:
>>
>> 2009/5/8 Daniel Stutzbach <daniel at stutzbachenterprises.com>:
>>>
>>> On Fri, May 8, 2009 at 6:14 PM, Benjamin Peterson <benjamin at python.org>
>>> wrote:
>>>>
>>>> Normally special methods use slots of the PyTypeObject struct.
>>>> typeobject.c looks up all those methods on Python classes correctly.
>>>> In the case of __enter__ and __exit__, the compiler generates bytecode
>>>> to look them up, and that bytecode use PyObject_Getattr.
>>>
>>> Would this problem apply to all special methods that don't use a slot in
>>> PyTypeObject, then?  I know of several other examples:
>>
>> Yes. I didn't think of those.
>>
>>> __reduce__
>>> __setstate__
>>> __reversed__
>>> __length_hint__
>>> __sizeof__
>>>
>>> (unless I misunderstand the definition of "special methods", which is
>>> possible)
>
> __reversed__, at least, is called by the reversed() builtin, so there is no
> LOAD_ATTR k (__reversed__) byte code.  So for that, the problem is reduced
> to accessing type(it).__reversed__ without going thru
> type(it).__getattribute__.  I would think that a function that did that
> would work for the others on the list (all 4?) that also have no LOAD_ATTR
> bytecode.  Would a modified version of object.__getattribute__ work?

No, it's easier to just use _PyObject_LookupSpecial there.



-- 
Regards,
Benjamin


More information about the Python-Dev mailing list