Guido van Rossum wrote:
> On Feb 13, 2008 2:20 PM, Eric Smith <[EMAIL PROTECTED]> wrote:
>> Nick Coghlan wrote:
>>> Eric Smith wrote:
>>>> I hate to be dense, but could you point me to some code that does
>>>> something similar but looks up the method by name?
>>> I was going to suggest __enter__/__exit__, but that code relies mainly
>>> on existing opcodes and just does an attribute lookup rather than
>>> explicitly bypassing the instance dictionary.
>>>
>>> However, the source code for cPickle may provide some ideas (when it
>>> looks up _reduce__/__getstate__/etc).
>> Those do look promising.  Thanks!
> 
> Or look in classobject.c itself; e.g. instance_str().

It uses a static helper function instance_getattr(), which while it 
looks like what I want, I can't get to.

So I've come up with the following.  I haven't checked for leaks yet, 
but at least it appears to do what I want, for both classic and 
new-style classes.  I'm still porting over test cases from 3.0, so I'm 
not convinced this is correct, yet.

/* Check for a __format__ method. */
meth = PyObject_GetAttr(value, str__format__);
if (meth)
     result = PyObject_CallFunctionObjArgs(meth, spec, NULL);
else {
     meth = _PyType_Lookup(Py_TYPE(value), str__format__);
     if (meth)
         result = PyObject_CallFunctionObjArgs(meth, value, spec, NULL);
     else {
        PyErr_Format(PyExc_TypeError,
                 "Type %.100s doesn't define __format__",
                 Py_TYPE(value)->tp_name);
         goto done;
     }
}


_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to