[Python-Dev] PEP 246, redux

Armin Rigo arigo at tunes.org
Tue Jan 11 13:41:57 CET 2005


Hi Phillip,

On Mon, Jan 10, 2005 at 04:38:55PM -0500, Phillip J. Eby wrote:
> Your new proposal does not actually fix this problem in the absence of 
> tp_conform/tp_adapt slots; it merely substitutes possible confusion at the 
> metaclass/class level for confusion at the class/instance level.

I think that what Alex has in mind 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.


A bientot,

Armin


More information about the Python-Dev mailing list