[Python-bugs-list] [ python-Bugs-493462 ] Attribute Search in MRO w/o tp_getattr

noreply@sourceforge.net noreply@sourceforge.net
Fri, 14 Dec 2001 13:41:57 -0800


Bugs item #493462, was opened at 2001-12-14 13:17
You can respond by visiting: 
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=493462&group_id=5470

>Category: Type/class unification
Group: Python 2.2
Status: Open
Resolution: None
Priority: 5
Submitted By: Robert Stewart (rstewart)
>Assigned to: Guido van Rossum (gvanrossum)
Summary: Attribute Search in MRO w/o tp_getattr

Initial Comment:
In writing a metatype, I wanted to resolve attribute 
references via a tp_getattr-style function -- with 
either a char * or a Python string.  Unfortunately, 
PyObject_GenericGetAttr() first tries _PyType_Lookup() 
to find a descriptor via base class dictionaries.

Searching according to the MRO is fine.  The problem 
is that _PyType_Lookup() only searches the dictionary 
of each base class.  It never checks those bases to 
see it tp_getattr is set.

My workaround, which is not ideal, is to implement my 
own tp_getattro function which first calls 
PyObject_GenericGetAttr() to locate the attribute.  If 
that succeeds, that attribute is returned.  If it 
fails, then the tp_getattr-style function is called to 
locate the attribute.  This approach will return a 
base class attribute when the derived class overrides 
it, which is why I said it was not ideal.

The only way I can improve this process is to write my 
own replacement for PyObject_GenericGetAttr() and 
_PyType_Lookup().  That would make my code very 
brittle, so that's not a good solution.

What I'd like to see is for _PyType_Lookup() to try 
the dictionary, as it does now.  If that fails, I'd 
like it to check to see if tp_getattr is set.  If so, 
I'd like it to call the tp_getattr function to resolve 
the attribute.  Perhaps this change violates some 
ideal of Python that I can't foresee, but it would 
sure work great for me.

----------------------------------------------------------------------

>Comment By: Guido van Rossum (gvanrossum)
Date: 2001-12-14 13:41

Message:
Logged In: YES 
user_id=6380

When you talk about the bases and their tp_getattr, are you
talking about the tp_getattr of the base type, or of its
metatype? (Note: forget about tp_getattr -- you should leave
that NULL, and only implement tp_getatto.)

PyObject_GenericGetAttr() should only be used in situations
where the base type's tp_getattro is also
PyObject_GenericGetAttr().

Why do you think that writing your own replacement for 
PyObject_GenericGetAttr() and _PyType_Lookup() would be
brittle? That's what you are *supposed* to do if you're not
happy with them.

What do you want to do with your metatype? Why do you need
one? Have you considered prototyping it in Python?

----------------------------------------------------------------------

You can respond by visiting: 
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=493462&group_id=5470