[IPython-dev] Using argparse for %magics
Robert Kern
robert.kern at gmail.com
Sun Apr 5 04:50:29 EDT 2009
I have updated my personal collection of %magics today:
http://www.enthought.com/~rkern/cgi-bin/hgwebdir.cgi/kernmagic
Not all of them are aimed at inclusion into IPython proper, but I think most of
them would be useful as Extensions, at least. Here are all of the collected
docstrings:
http://www.enthought.com/~rkern/cgi-bin/hgwebdir.cgi/kernmagic/raw-file/tip/help.txt
The recently added magics are
%push_err/%pop_err for controlling numpy's error handling options via a
stack. These complement %push_print/%pop_print, which control numpy's printing
options the same way.
%print_methods (optional alias %pm) for printing the methods of an object,
grouped by the defining class.
%print_traits (optional alias %pt) for printing the traits of a HasTraits
object, grouped by the defining class. Crazy-useful.
One thing you might want to consider for IPython proper is the mini-framework I
use for parsing the arguments. I made some decorators which use argparse (now in
IPython.externals, amen) to build parsers for those magics that take CLI-style
--options. It's nicely declarative and makes the option parsing and help text
style uniform across all of the magics. We've discussed having a standard for
all of the --option-taking %magics that come with IPython, and I put this
forward as an improvement over the current manual getopt code.
Here is the start of one of my %magics, to demonstrate:
from kernmagic.magic_arguments import magic_arguments, argument, parse_argstring
@magic_arguments()
@argument('-e', '--encoding', default='utf-8',
help="the encoding to use for unicode objects; no effect on str objects "
"[default: %(default)s]")
@argument('-m', '--mode', default='wb',
help="the file mode to use when opening the file for writing")
@argument('variable', help="the name of the variable")
@argument('filename', nargs='?',
help="the filename to write [default: the variable's name]")
def magic_fwrite(self, arg):
""" Write text out to a file.
"""
args = parse_argstring(magic_fwrite, arg)
if args.filename is None:
args.filename = args.variable
filename = os.path.expanduser(args.filename)
...
Here is the generated help:
In [7]: %fwrite?
Type: Magic function
Base Class: <type 'instancemethod'>
Namespace: IPython internal
File: /Users/rkern/hg/kernmagic/kernmagic/mymagics.py
Definition: %fwrite(self, arg)
Docstring:
%fwrite [-e ENCODING] [-m MODE] variable [filename]
Write text out to a file.
positional arguments:
variable the name of the variable
filename the filename to write [default: the variable's name]
optional arguments:
-e ENCODING, --encoding ENCODING
the encoding to use for unicode objects; no effect on
str objects [default: utf-8]
-m MODE, --mode MODE the file mode to use when opening the file for writing
I also have a cross-platform terminal_size() function in utils.py that should
probably be made part of the ipapi (hookable by GUI frontends, of course).
--
Robert Kern
"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
More information about the IPython-dev
mailing list