getattr and __mro__ (was Re: [Python-Dev] PEP 246, redux)
Thomas Heller
theller at python.net
Wed Jan 12 16:44:57 CET 2005
Armin Rigo <arigo at tunes.org> writes:
> ... is that the __adapt__() and __conform__() methods should work just
> like all other special methods for new-style classes. The confusion
> comes from the fact that the reference implementation doesn't do that.
> It should be fixed by replacing:
>
> conform = getattr(type(obj), '__conform__', None)
>
> with:
>
> for basecls in type(obj).__mro__:
> if '__conform__' in basecls.__dict__:
> conform = basecls.__dict__['__conform__']
> break
> else:
> # not found
>
> and the same for '__adapt__'.
>
> The point about tp_xxx slots is that when implemented in C with slots, you get
> the latter (correct) effect for free. This is how metaconfusion is avoided in
> post-2.2 Python. Using getattr() for that is essentially broken. Trying to
> call the method and catching TypeErrors seems pretty fragile -- e.g. if you
> are calling a __conform__() which is implemented in C you won't get a Python
> frame in the traceback either.
I'm confused. Do you mean that
getattr(obj, "somemethod")(...)
does something different than
obj.somemethod(...)
with new style class instances? Doesn't getattr search the __dict__'s
along the __mro__ list?
Thomas
More information about the Python-Dev
mailing list