interface boilerplate

John Hunter jdhunter at ace.bsd.uchicago.edu
Sun Oct 17 21:40:25 CEST 2004


In matplotlib, a plotting library with an OO API and a matlab-like
procedural interface, I have a lot of functions defined in the matlab
interface module that wrap similarly named class methods defined in
the Axes class of the axes module.  Eg, the Axes class defines a plot
method and the matlab interface defines a plot function that gets the
current Axes instance, calls the plot method on that instance, and
does some error handling.  Here is the matlab interface wrapper (gca()
returns the current Axes instance)

def plot(*args, **kwargs):
    try:
        ret =  gca().plot(*args, **kwargs)
    except ValueError, msg:
        msg = raise_msg_to_str(msg)
        error_msg(msg)
    else:
        draw_if_interactive()
        return ret
plot.__doc__ = Axes.plot.__doc__

This is mostly boilerplate code that a lot of matlab interface
functions use, and I'd like to automatically generate it.

This appears to (mostly) work

def _wrap_axfunc(name):
    def wrapper(*args, **kwargs):
        try:
            func = getattr(gca(), name)
            ret =  func(*args, **kwargs)
        except ValueError, msg:
            msg = raise_msg_to_str(msg)
            error_msg(msg)
        else:
            draw_if_interactive()
            return ret
    wrapper.__doc__ = getattr(Axes, name).__doc__
    #wrapper.__name__ = name
    return wrapper

plot = _wrap_axfunc('plot')

The only problem I've seen so far is that the name of the function in
pydoc string is 'wrapper', and I want it to appear as "plot".  I tried
setting the __name__ attribute, but it is read only.

Any suggestions on how to best define these matlab interface functions
by automatically wrapping the Axes instance functions?  I'd like to
support python2.2 so python2.2 compliant solutions especially welcome.

JDH



More information about the Python-list mailing list