Porting Code to Python 3
While there are many differences between Python 2 and Python 3 few of them impact most of the code that we write in the Salish Sea project. This section describes the types of changes that had to be made in order to convert (also known as “port”) the SalishSeaTools Package to Python 3.
If you encounter other changes that you need to make to port our code to Python 3, please feel free to add them below.
If you are interested in the details of the differences between Python 2 and Python 3 they can be found in the What’s New in Python documentation.
Part of the move to Python 3 was a reorganization of the standard library.
That means that some import need to be changed when code is ported from Python 2 to Python 3.
Specific instances of that
(like the StringIO
module)
are described below.
The description of all of the standard library changes is contained in PEP 3108.
Porting the SalishSeaTools
Package
This section describes the types of changes that had to be made to port the SalishSeaTools Package
(including the nowcast
codebase)
from Python 2.7 to Python 3.5 in October 2015.
Mixed TABs and Spaces for Indentation
While mixing TABs and spaces for indentation in a Python module was never a good idea,
it causes a TabError
exception to be raised when such a module is imported in Python 3.
All Python code should use spaces for indentation and the indentation levels should be 4 spaces.
Change print
Statements to print()
Functions
print
was a statement in Python 2.
It is a function in Python 3.
So,
code like:
print 'red is clockwise'
has to be changed to:
print('red is clockwise')
Change cStringIO.StringIO
Imports to io.StringIO
In Python 2 StringIO
class in the standard library has two implementations,
one in Python,
and a faster one in C.
The former was imported like:
from StringIO import StringIO
and the latter like:
from cStringIO import StringIO
In Python 3 the StringIO
class has been moved to the io
module and the interpreter takes care of first trying to import the faster C version or falling back to the Python version if necessary.
So,
those imports need to be changes to:
from io import StringIO
mock
Library is in the Standard Library
Note
This is only applicable to test suite code.
The mock
library that was developed as a separate,
stand-alone library for Python 2 is included in the standard library in Python 3.
So,
instead from it like:
from mock import (
Mock,
patch,
)
the Python 3 import looks like:
from unittest.mock import (
Mock,
patch,
)
Also,
because mock
is now part of the standard library,
it no longer needs to be installed separately or included in setup.py
or environment descriptions files
(requirements.txt
,
requirements.pip
,
environment.yaml
,
etc.).