SageMath is currently using Python2, but is moving towards Python3. To make transition possible, it is required that the code must be as compatible as possible with both Python2 and Python3. Let us describe a few important points.

Do not use xrange

You can use xrange only inside Cython files (*.pyx). If you need an iterator range, you should add "from six.moves import range" in the top import section of you *.py file.

In the doctests, make sure that your doctest will still work when range becomes an iterator.

Behaviour of print

The behaviour of print differs in Python 2 and in Python 3.

SageMath interface is currently using the Python2 syntax for print, but SageMath code is written in such a way that it is also Python3 compatible. It is therefore required to use print in a way that is compatible with both Python 2 and Python 3.

In the Python 3 syntax, print is a function.

The easiest way to achieve this compatibility is to always use print(...) with a single string inside the parentheses.

For example, print("He has eaten {} bananas".format(10)) will work in both Python 2 and Python 3 and give the same result.

Here below are some instructions for going from Python 2-only print to Python 3-only print. The Python 3 syntax can be used right now if you add the line

from __future__ import print_function

as the first code line of your python files.

To convert print from Python 2 to Python 3, you basically need to add parentheses, and write print("x") instead of print "x".

Here is a conversion table to help you adapt your code in more complex cases:

Python 2

Python 3

print a

print(a)

print a, b, c

print(a, b, c)

print x,

print(x, end=" ")

print >>sys.stderr, x

print(x, file=sys.stderr)