[IPython-dev] cell magics

Jason Grout jason-sage at creativetrax.com
Fri Feb 15 22:21:18 EST 2013


William Stein and I have been discussing cell magics lately as he is 
implementing them in his Salvus project.  I think the result, which is a 
little different than the current IPython system, is more consistent, 
easier to read, and more elegant.  What are your thoughts?

PROPOSAL:

Line and cell magics are normal python functions that take a string as 
their first input.  The string is either the rest of the line, or if 
there is no discernible string on the rest of the line, the string is 
taken as the rest of the cell.  As an example:

%timeit(runs=10) 2+3

which gets translated to time("2+3", runs=10)

A cell magic is exactly the same function, only it is invoked by putting 
the string on the following lines, rather than on the same line, so the 
string is taken as the remainder of the cell:

%timeit(runs=10)
2+3
5+6

which gets translated to timeit("2+3\n5+6", runs=10)

Notice there is no distinction between line and cell magic 
functions---the distinction entirely happens in how they are invoked 
(whether the string is on the same line or on following lines).  Also, 
magic options are passed in exactly the same way that arguments are 
always passed to python functions, instead of having a non-pythonic, 
bash-like syntax for options.

END OF PROPOSAL

That's the proposal.  I got to thinking more about it too.  The whole 
concept of magics (passing a string to a function) is like decorators. 
In fact, we could make it exactly like decorators, if we wanted (I'm not 
sure that we want to introduce the extra complexity, but it would be 
more consistent with decorators):

%timeit 2+3

transforms to timeit("2+3"), but

%timeit(runs=4) 2+3

effectively does timeit(runs=4)("2+3")

In some sense, the magics are implementing a very (*very*) rudimentary 
macro system for python, the advantages being that we can pass an 
unevaluated string into a function without having to type the quote 
marks.  Right now we can only pass in single-line strings or the entire 
rest of the cell.  But what if we brainstormed for other ways to denote 
a string that was to be treated special?  For example, we could use a 
github/markdown-like syntax:

```timeit(runs=4)
2+3
5+6
```

(except that python supports `a` is repr(a)).  But this might look nice:

```R
hist(x)
```

translating to R("hist(x)"). In fact, we could make it even more lispy 
by supporting parameter expansion:

```R
hist(%d)
```%x

which would do something like R("hist(%d)"%x)

I'm just brainstorming at the end here, but I'm still curious your 
thoughts on the subject, especially on the first proposal of unifying 
the line and cell magic syntax and calling syntax to be more consistent 
with each other and with python.

Thanks,

Jason




More information about the IPython-dev mailing list