[Python-3000] [Python-Dev] PEP 367: New Super

Tim Delaney timothy.c.delaney at gmail.com
Thu May 31 15:25:17 CEST 2007


Guido van Rossum wrote:

>> The patch notes say that you're actually inserting a keyword-only
>> argument - is this purely meant to be a stopgap measure so that
>> you've got a local (which could be put into a cell)?
>
> I'm not using a cell because I'm storing the result of calling
> super(Class, self) -- that is different for each instance, while a
> cell would be shared by all invocations of the same function.

I'm actually investigating another (possibly complementary) option at the 
moment - adding an im_super attribute to methods, which would store either a 
bound or unbound super instance when the bound or unbound method object is 
created. method_new becomes:

static PyObject *
method_new(PyTypeObject* type, PyObject* args, PyObject *kw)
{
    PyObject *func;
    PyObject *self;
    PyObject *classObj = NULL;

    if (!_PyArg_NoKeywords("instancemethod", kw))
        return NULL;
    if (!PyArg_UnpackTuple(args, "method", 2, 3,
                  &func, &self, &classObj))
        return NULL;
    if (!PyCallable_Check(func)) {
        PyErr_SetString(PyExc_TypeError,
                "first argument must be callable");
        return NULL;
    }
    if (self == Py_None)
        self = NULL;
    if (self == NULL && classObj == NULL) {
        PyErr_SetString(PyExc_TypeError,
            "unbound methods must have non-NULL im_class");
        return NULL;
    }

    return PyMethod_New(func, self, classObj);
}

then in method_call we could have:

static PyObject *
method_call(PyObject *func, PyObject *arg, PyObject *kw)
{
    PyObject *self = PyMethod_GET_SELF(func);
    PyObject *klass = PyMethod_GET_CLASS(func);
    PyObject *supervalue = PyMethod_GET_SUPER(func);

and populate the `super` argument from supervalue. I think im_super has uses 
on its own (esp. for introspection).

>> Presumably with this approach you could
>> call the method like:
>>
>>     A().func(1, 2, super=object())
>
> No, because that would be a syntax error (super as a keyword is only
> allowed as an atom). You could get the same effect with
>
>  A().func(1, 2, **{'super': object()})
>
> but that's so obscure I don't mind.

I'd prefer to eliminate it, but that's a detail that can be taken care of 
later.

Anyway, need to go to bed - have to be up in 6 hours.

Cheers,

Tim Delaney 



More information about the Python-3000 mailing list