[IPython-dev] what is the best way of doing pretty print with ipython

Ondrej Certik ondrej at certik.cz
Mon Jan 7 09:02:48 EST 2008


in SymPy, we use ipython as an easy to use shell and generally it
works incredibly well:

$ bin/isympy
Python 2.4.4 console for SymPy 0.5.11-hg. These commands were executed:
>>> from __future__ import division
>>> from sympy import *
>>> x, y, z = symbols('xyz')
>>> k, m, n = symbols('kmn', integer=True)
>>> f = Function("f")
>>> Basic.set_repr_level(2)     # pretty print output; Use "1" for python output
>>> pprint_try_use_unicode()    # use unicode pretty print when available

Documentation can be found at http://sympy.org/

In [1]: integr
integrals  integrate

In [1]: integrate(x**2 * cos(x), x)
-2*sin(x) + x *sin(x) + 2*x*cos(x)

In [2]: x**2

In [3]:

However, we are abusing python repr() function as shown here:

In [3]: repr(x**2)
Out[3]: ' 2\nx '

In [4]: str(x**2)
Out[4]: 'x**2'

The repr() should return just one line and be something that can be
"almost" parsed back to python.

We can control this behavior:

In [1]: x**2

In [2]: Basic.set_repr_level(1)
Out[2]: 2

In [3]: x**2
Out[3]: x**2

But it doesn't help always, consider:

In [1]: (x**2, x**3, y)
( 2
x ,  3
x , y)

In [2]: Basic.set_repr_level(1)
Out[2]: 2

In [3]: (x**2, x**3, y)
Out[3]: (x**2, x**3, y)

the [3] is fine, but [1] is completely messed up.

OK, how to fix this? My idea is to use repr() just for the 1D
printing, like in [3] and force ipython to use maybe str()? Or our
custom method.

What would you recommend as the best way to approach this in ipython?


More information about the IPython-dev mailing list