getattr and mro (was Re: [Python-Dev] PEP 246, redux) (original) (raw)

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