The metaclass boilerplate is safe to apply en masse. The future import boilerplate needs code to be inspected to be sure that there aren't any py2isms that need to be fixed. Split these two checks so that we can fix them independently Be explicit about which files are grandfathered so we can fix them up one by one
2.1 KiB
Sanity Tests » from __future__ boilerplate
Most Python files should include the following boilerplate at the top of the file, right after the comment header:
from __future__ import (absolute_import, division, print_function)
This uses Python 3 semantics for absolute vs relative imports, division, and print. By doing this, we can write code which is portable between Python 2 and Python 3 by following the Python 3 semantics.
absolute_import
When Python 2 encounters an import of a name in a file like
import copy
it attempts to load copy.py
from
the same directory as the file is in. This can cause problems if there
is a python file of that name in the directory and also a python module
in sys.path
with that same name. In that case, Python 2
would load the one in the same directory and there would be no way to
load the one on sys.path
. Python 3 fixes this by making
imports absolute by default. import copy
will find
copy.py
from sys.path
. If you want to import
copy.py
from the same directory, the code needs to be
changed to perform a relative import:
from . import copy
.
division
In Python 2, the division operator (/
) returns integer
values when used with integers. If there was a remainder, this part
would be left off (aka, floor division).
In Python 3, the division operator (/
) always returns a
floating point number. Code that needs to calculate the integer portion
of the quotient needs to switch to using the floor division operator
(//) instead.
print_function
In Python 2, python:print
is a keyword. In Python 3, python3:print
is a function
with different parameters. Using this __future__
allows
using the Python 3 print semantics everywhere.