[IPython-dev] ipipe news

Walter Dörwald walter at livinglogic.de
Thu Mar 2 14:45:22 CST 2006


John Hunter wrote:
>>>>>> "Walter" == Walter Dörwald <walter at livinglogic.de> writes:
>     >> This morning I was thinking about the usefulness of an object
>     >> browser class "iobj", that does a dir on an object and reports
>     >> the attribute names in the first class and the attribute values
>     >> in the right.  Something like myobj | ifilter("not
>     >> attr.startswith('_')") | ibrowse
> 
>     Walter> You should be able to do: myobj.__dict__ | ifilter("not
>     Walter> key.startswith('_')") | ibrowse
> 
>     Walter> Unfortunately this is currently broken, but I sent a patch
>     Walter> to Ville a few minutes ago that fixes this problem.
> 
> Yep, that patch was in response to me playing with o.__dict__|ibrowse,
> I think.

Indeed!

> I was looking for something a bit broader than __dict__ though, namely
> something that uses dir(obj) combined with getattr.

How about something like this:
import ipipe

class iinspect(ipipe.Pipe):
     def __xiter__(self, mode):
         fields = ("key", "value")
         for key in dir(self.input):
             yield ipipe.Fields(
                fields,
                key=key,
                value=getattr(self.input, key)
             )

With this you can do:
 >>> 42 | iinspect

(Although this isn't a real pipe any more, as the input isn't really 
iterable)

> The motivation is that matplotlib has an object introspection
> mechanism by doing a dir on objects and looking for names that have
> set_something or get_something, where something is a property (we
> basically have our own hacked up version of python properties).  A
> custom ifilter could be written to browse these properties, by
> filtering on callable attrs that start with 'set_'

You can hack the iinspect class from above, to give you something like that.

> Here's a little example of using setp, the object inspector, in
> pylab.  I was hoping to hack up a ipipe version...
> 
> In [4]: line, = plot(rand(10))
> 
> In [5]: [a for a in dir(line) if a.startswith('set_') and callable(getattr(line, a))]
> Out[5]:
> ['set_aa', 'set_alpha', 'set_animated', 'set_antialiased', 'set_c',
>  'set_clip_box', 'set_clip_on', 'set_color', 'set_dash_capstyle',
>  'set_dash_joinstyle', 'set_dashes', 'set_data', 'set_figure',
>  'set_label', 'set_linestyle', 'set_linewidth', 'set_lod', 'set_ls',
>  'set_lw', 'set_marker', 'set_markeredgecolor', 'set_markeredgewidth',
>  'set_markerfacecolor', 'set_markersize', 'set_mec', 'set_mew',
>  'set_mfc', 'set_ms', 'set_solid_capstyle', 'set_solid_joinstyle',
>  'set_transform', 'set_visible', 'set_xdata', 'set_ydata',
>  'set_zorder']

The following should do it:

class iinspect(ipipe.Pipe):
     def __xiter__(self, mode):
         fields = ("key", "value")
         for key in dir(self.input):
            if key.startswith("set_"):
                value = getattr(self.input, key)
                    if callable(value):
                        yield ipipe.Fields(fields, key=key, value=value)

> In [6]: setp(line)
>     alpha: float
>     animated: [True | False]
>     antialiased or aa: [True | False]
>     clip_box: a matplotlib.transform.Bbox instance
>     clip_on: [True | False]
>     color or c: any matplotlib color - see help(colors)
>     dash_capstyle: ['butt' | 'round' | 'projecting']
>     dash_joinstyle: ['miter' | 'round' | 'bevel']
>     dashes: sequence of on/off ink in points
>     data: (array xdata, array ydata)
>     figure: a matplotlib.figure.Figure instance
>     label: any string
>     linestyle or ls: [ '-' | '--' | '-.' | ':' | 'steps' | 'None' ]
>     linewidth or lw: float value in points
>     lod: [True | False]
>     marker: [ '+' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' |
>     'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' |
>     '|' ]
>     markeredgecolor or mec: any matplotlib color - see help(colors)
>     markeredgewidth or mew: float value in points
>     markerfacecolor or mfc: any matplotlib color - see help(colors)
>     markersize or ms: float
>     solid_capstyle: ['butt' | 'round' |  'projecting']
>     solid_joinstyle: ['miter' | 'round' | 'bevel']
>     transform: a matplotlib.transform transformation instance
>     visible: [True | False]
>     xdata: array
>     ydata: array
>     zorder: any number

I don't know where this comes from, are these the docstrings of the 
properties?

Servus,
    Walter




More information about the IPython-dev mailing list