IPython %magic

  Saturday, January 16, 2016 » python productivity

IPython is a more powerful interactive shell for python.

In this post I’ll explore some of my favorite IPython features.

History ΒΆ

In IPython In and Out aren’t just visual aid. Those are regular python variables:

In [1]: x = 1

In [2]: In
Out[2]: ['', 'x = 1', 'In']

In [3]: Out
Out[3]: {2: ['', 'x = 1', 'In', 'Out']}

In is a regular python list. Out is a dict.

Magic functions ΒΆ

IPython has a set of predefined magic functions. Magic functions are invoked by typing % or %% followed by the magic function name and its arguments. Opposed to python functions, magic function arguments aren’t surrounded by parentheses and aren’t separated by commas.

The difference between % and %% is how the arguments are interpreted. With % only the current line is interpreted and the command is immediately executed. With %% the arguments are expected to be on multiple-lines.

%history magic to generate doctest-ready output ΒΆ

One of my favorite is the %history magic. It can be used to generate doctest code. Below is an example:

In [1]: from cr8.misc import parse_table

In [2]: parse_table('users')
Out[2]: ('doc', 'users')

In [3]: parse_table('x.users')
Out[3]: ('x', 'users')

In [4]: %history -op 2-3
>>> parse_table('users')
('doc', 'users')
>>> parse_table('x.users')
('x', 'users')

An alternative to generate doctest-ready output would be to switch into %doctest_mode.

%save ΒΆ

Every once in a while I start out in IPython to quickly test something only to realize that things are starting to get longer than I thought. It would have been better to create a file.

Instead of re-typing everything in a file, %save can be used to save the history to a file:

%save foo.py 1-10

Where 1-10 is a history-range, specifying which lines from In to save.

%edit ΒΆ

Editing multi-line statements in IPython can get troublesome. %edit can be used to launch an editor to write expressions. The expressions will be executed once the editor is closed.

A cool thing about %edit is how it handles arguments.

Not only can you pass a filename or a history-range, but also objects. If it is an object IPython will try to locate the file where it was defined and open the editor at that point.

This means it is possible to open functions or even entire modules. For example: %edit requests opens [...]/requests/__init__.py if the requests module had been imported.

%timeit ΒΆ

%timeit uses the timeit module to time the execution of a statement or expression:

Great for quick benchmarks:

%timeit datetime.now()
1000000 loops, best of 3: 1.2 Β΅s per loop

%timeit datetime.utcnow()
1000000 loops, best of 3: 455 ns per loop

%prun ΒΆ

Runs a statement through the profiler:

%prun 2 * 2
        3 function calls in 0.000 seconds

Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

? and ?? ΒΆ

? and ?? can be used to get help for an object:

In [11]: x??
Type:        int
String form: 1
Docstring:
int(x=0) -> integer
int(x, base=10) -> integer

Convert a number or string ...

Both work as prefix or suffix. So ??x works too. They also work on magic functions. So if you’re wondering what %doctest_mode does, you can use %doctest_mode?? to get more information.