Changes in previous versions¶
Changes in the most recent major version are here: What’s New.
Changes in version 0.18.3 (2023-01-13)¶
This is a minor bug-fix release containing a number of fixes:
Backport fix for bpo-38804 (c91d70b)
Fix bug in fix_print.py fixer (dffc579)
Fix bug in fix_raise.py fixer (3401099)
Fix newint bool in py3 (fe645ba)
Fix bug in super() with metaclasses (6e27aac)
docs: fix simple typo, reqest -> request (974eb1f)
Correct __eq__ (c780bf5)
Pass if lint fails (2abe00d)
Update docker image and parcel out to constant variable. Add comment to update version constant (45cf382)
fix order (f96a219)
Add flake8 to image (046ff18)
Make lint.sh executable (58cc984)
Add docker push to optimize CI (01e8440)
Build System (42b3025)
Add docs build status badge to README.md (3f40bd7)
Use same docs requirements in tox (18ecc5a)
Add docs/requirements.txt (5f9893f)
Add PY37_PLUS, PY38_PLUS, and PY39_PLUS (bee0247)
fix 2.6 test, better comment (ddedcb9)
fix 2.6 test (3f1ff7e)
remove nan test (4dbded1)
include list test values (e3f1a12)
fix other python2 test issues (c051026)
fix missing subTest (f006cad)
import from old imp library on older python versions (fc84fa8)
replace fstrings with format for python 3.4,3.5 (4a687ea)
minor style/spelling fixes (8302d8c)
improve cmp function, add unittest (0d95a40)
Pin typing==3.7.4.1 for Python 3.3 compatiblity (1a48f1b)
Fix various py26 unit test failures (9ca5a14)
Add initial contributing guide with docs build instruction (e55f915)
Add docs building to tox.ini (3ee9e7f)
Support NumPy’s specialized int types in builtins.round (b4b54f0)
Added r””” to the docstring to avoid warnings in python3 (5f94572)
Add __subclasscheck__ for past.types.basestring (c9bc0ff)
Correct example in README (681e78c)
Add simple documentation (6c6e3ae)
Add pre-commit hooks (a9c6a37)
Handling of __next__ and next by future.utils.get_next was reversed (52b0ff9)
Add a test for our fix (461d77e)
Compare headers to correct definition of str (3eaa8fd)
#322 Add support for negative ndigits in round; additionally, fixing a bug so that it handles passing in Decimal properly (a4911b9)
Add tkFileDialog to future.movers.tkinter (f6a6549)
Sort before comparing dicts in TestChainMap (6126997)
Fix typo (4dfa099)
Fix formatting in “What’s new” (1663dfa)
Fix typo (4236061)
Avoid DeprecationWarning caused by invalid escape (e4b7fa1)
Fixup broken link to external django documentation re: porting to Python 3 and unicode_literals (d87713e)
Fixed newdict checking version every time (99030ec)
Add count from 2.7 to 2.6 (1b8ef51)
Changes in version 0.18.2 (2019-10-30)¶
This is a minor bug-fix release containing a number of fixes:
Fix min/max functions with generators, and ‘None’ default (PR #514)
Use BaseException in raise_() (PR #515)
Fix builtins.round() for Decimals (Issue #501)
Fix raise_from() to prevent failures with immutable classes (PR #518)
Make FixInput idempotent (Issue #427)
Fix type in newround (PR #521)
Support mimetype guessing in urllib2 for Py3.8+ (Issue #508)
Python 3.8 is not yet officially supported.
Changes in version 0.18.1 (2019-10-09)¶
This is a minor bug-fix release containing a fix for raise_() when passed an exception that’s not an Exception (e.g. BaseException subclasses)
Changes in version 0.18.0 (2019-10-09)¶
This is a major bug-fix and feature release, including:
Fix collections.abc import for py38+
Remove import for isnewbytes() function, reducing CPU cost significantly
Fix bug with importing past.translation when importing past which breaks zipped python installations
Fix an issue with copyreg import under Py3 that results in unexposed stdlib functionality
Export and document types in future.utils
Update behavior of newstr.__eq__() to match str.__eq__() as per reference docs
Fix raising and the raising fixer to handle cases where the syntax is ambiguous
Allow “default” parameter in min() and max() (Issue #334)
Implement __hash__() in newstr (Issue #454)
Future proof some version checks to handle the fact that Py4 won’t be a major breaking release
Fix urllib.request imports for Python 3.8 compatibility (Issue #447)
Fix future import ordering (Issue #445)
Fixed bug in fix_division_safe fixture (Issue #434)
Do not globally destroy re.ASCII in PY3
Fix a bug in email.Message.set_boundary() (Issue #429)
Implement format_map() in str
Implement readinto() for socket.fp
As well as a number of corrections to a variety of documentation, and updates to test infrastructure.
Changes in version 0.17.1 (2018-10-30)¶
This release address a packaging error because of an erroneous declaration that any built wheels are universal.
Changes in version 0.17.0 (2018-10-19)¶
This is a major bug-fix release, including:
Fix
from collections import ChainMap
after install_aliases() (issue #226)Fix multiple import from
__future__
bug in futurize (issue #113)Add support for proper %s formatting of newbytes
Properly implement iterator protocol for newrange object
Fix
past.translation
on read-only file systemsFix Tkinter import bug introduced in Python 2.7.4 (issue #262)
Correct TypeError to ValueError in a specific edge case for newrange
Support inequality tests between newstrs and newbytes
Add type check to __get__ in newsuper
Fix fix_divsion_safe to support better conversion of complex expressions, and skip obvious float division.
As well as a number of corrections to a variety of documentation, and updates to test infrastructure.
Changes in version 0.16.0 (2016-10-27)¶
This release removes the configparser
package as an alias for
ConfigParser
on Py2 to improve compatibility with the backported
configparser package <https://pypi.org/project/configparser/>. Previously
python-future
and the PyPI configparser
backport clashed, causing
various compatibility issues. (Issues #118, #181)
If your code previously relied on configparser
being supplied by
python-future
, the recommended upgrade path is to run pip install
configparser
or add configparser
to your requirements.txt
file.
Note that, if you are upgrading future
with pip
, you may need to
uninstall the old version of future or manually remove the
site-packages/future-0.15.2-py2.7.egg
folder for this change to take
effect on your system.
This releases also fixes these bugs:
Fix
newbytes
constructor bug. (Issue #171)Fix semantics of
bool()
withnewobject
. (Issue #211)Fix
standard_library.install_aliases()
on PyPy. (Issue #205)Fix assertRaises for
pow
andcompile`
on Python 3.5. (Issue #183)Fix return argument of
future.utils.ensure_new_type
if conversion to new type does not exist. (Issue #185)Add missing
cmp_to_key
for Py2.6. (Issue #189)Allow the
old_div
fixer to be disabled. (Issue #190)Improve compatibility with Google App Engine. (Issue #231)
Add some missing imports to the
tkinter
andtkinter.filedialog
package namespaces. (Issues #212 and #233)More complete implementation of
raise_from
on PY3. (Issues #141, #213 and #235, fix provided by Varriount)
Changes in version 0.15.2 (2015-09-11)¶
This is a minor bug-fix release:
Fix
socket.create_connection()
backport on Py2.6 (issue #162)Add more tests of
urllib.request
etc.Fix
newsuper()
calls from the__init__
method of PyQt subclassses (issue #160, thanks to Christopher Arndt)
Changes in version 0.15.1 (2015-09-09)¶
This is a minor bug-fix release:
Use 3-argument
socket.create_connection()
backport to restore Py2.6 compatibility inurllib.request.urlopen()
(issue #162)Remove breakpoint in
future.backports.http.client
triggered on certain data (issue #164)Move
exec
fixer to stage 1 offuturize
because the forward-compatibleexec(a, b)
idiom is supported in Python 2.6 and 2.7. See https://docs.python.org/2/reference/simple_stmts.html#exec.
Changes in version 0.15.0 (2015-07-25)¶
This release fixes compatibility bugs with CherryPy’s Py2/3 compat layer and
the latest version of the urllib3
package. It also adds some additional
backports for Py2.6 and Py2.7 from Py3.4’s standard library.
New features:
install_aliases()
now exposes full backports of the Py3 urllib submodules (parse
,request
etc.) fromfuture.backports.urllib
as submodules ofurllib
on Py2. This implies, for example, thaturllib.parse.unquote
now takes an optional encoding argument as it does on Py3. This improves compatibility with CherryPy’s Py2/3 compat layer (issue #158).tkinter.ttk
support (issue #151)Backport of
collections.ChainMap
(issue #150)Backport of
itertools.count
for Py2.6 (issue #152)Enable and document support for the
surrogateescape
error handler fornewstr
andnewbytes
objects on Py2.x (issue #116). This feature is currently in alpha.Add constants to
http.client
such asHTTP_PORT
andBAD_REQUEST
(issue #137)Backport of
reprlib.recursive_repr
to Py2
Bug fixes:
Add
HTTPMessage
tohttp.client
, which is missing fromhttplib.__all__
on Python <= 2.7.10. This restores compatibility with the latesturllib3
package (issue #159, thanks to Waldemar Kornewald)Expand newint.__divmod__ and newint.__rdivmod__ to fall back to <type ‘long’> implementations where appropriate (issue #146 - thanks to Matt Bogosian)
Fix newrange slicing for some slice/range combos (issue #132, thanks to Brad Walker)
Small doc fixes (thanks to Michael Joseph and Tim Tröndle)
Improve robustness of test suite against opening .pyc files as text on Py2
Update backports of
Counter
andOrderedDict
to use the newer implementations from Py3.4. This fixes.copy()
preserving subclasses etc.futurize
no longer breaks working Py2 code by changingbasestring
tostr
. Instead it imports thebasestring
forward-port frompast.builtins
(issues #127 and #156)future.utils
: addstring_types
etc. and update docs (issue #126)
Changes in version 0.14.3 (2014-12-15)¶
This is a bug-fix release:
Expose contents of
thread
(notdummy_thread
) as_thread
on Py2 (Issue #124)Add signed support for
newint.to_bytes()
(Issue #128)Fix
OrderedDict.clear()
on Py2.6 (Issue #125)Improve
newrange
: equality and slicing, start/stop/step properties, refactoring (Issues #129, #130)Minor doc updates
Changes in version 0.14.2 (2014-11-21)¶
This is a bug-fix release:
Speed up importing of
past.translation
(Issue #117)html.escape()
: replace function with the more robust one from Py3.4futurize
: avoid displacing encoding comments by__future__
imports (Issues #97, #10, #121)futurize
: don’t swallow exit code (Issue #119)Packaging: don’t forcibly remove the old build dir in
setup.py
(Issue #108)Docs: update further docs and tests to refer to
install_aliases()
instead ofinstall_hooks()
Docs: fix
iteritems
import error in cheat sheet (Issue #120)Tests: don’t rely on presence of
test.test_support
on Py2 ortest.support
on Py3 (Issue #109)Tests: don’t override existing
PYTHONPATH
for tests (PR #111)
Changes in version 0.14.1 (2014-10-02)¶
This is a minor bug-fix release:
Docs: add a missing template file for building docs (Issue #108)
Tests: fix a bug in error handling while reporting failed script runs (Issue #109)
install_aliases()
: don’t assume that thetest.test_support
module always exists on Py2 (Issue #109)
Changes in version 0.14.0 (2014-10-02)¶
This is a major new release that offers a cleaner interface for most imports in Python 2/3 compatible code.
Instead of this interface:
>>> from future.builtins import str, open, range, dict
>>> from future.standard_library import hooks
>>> with hooks():
... import queue
... import configparser
... import tkinter.dialog
... # etc.
You can now use the following interface for much Python 2/3 compatible code:
>>> # Alias for future.builtins on Py2:
>>> from builtins import str, open, range, dict
>>> # Alias for future.moves.* on Py2:
>>> import queue
>>> import configparser
>>> import tkinter.dialog
>>> etc.
Notice that the above code will run on Python 3 even without the presence of the
future
package. Of the 44 standard library modules that were refactored with
PEP 3108, 30 are supported with direct imports in this manner. (These are listed
here: Direct imports.)
The other 14 standard library modules that kept the same top-level names in
Py3.x are not supported with this direct import interface on Py2. These include
the 5 modules in the Py3 urllib
package. These modules are accessible through
the following interface (as well as the interfaces offered in previous versions
of python-future
):
from future.standard_library import install_aliases
install_aliases()
from collections import UserDict, UserList, UserString
import dbm.gnu
from itertools import filterfalse, zip_longest
from subprocess import getoutput, getstatusoutput
from sys import intern
import test.support
from urllib.request import urlopen
from urllib.parse import urlparse
# etc.
from collections import Counter, OrderedDict # backported to Py2.6
The complete list of packages supported with this interface is here: Aliased imports.
For more information on these and other interfaces to the standard library, see Standard library imports.
Bug fixes¶
This release expands the
future.moves
package to include most of the remaining modules that were moved in the standard library reorganization (PEP 3108). (Issue #104)This release also removes the broken
--doctests_only
option from thefuturize
andpasteurize
scripts for now. (Issue #103)
Internal cleanups¶
The project folder structure has changed. Top-level packages are now in a
src
folder and the tests have been moved into a project-level tests
folder.
The following deprecated internal modules have been removed (Issue #80):
future.utils.encoding
andfuture.utils.six
.
Deprecations¶
The following internal functions have been deprecated and will be removed in a future release:
future.standard_library.scrub_py2_sys_modules
future.standard_library.scrub_future_sys_modules
Changes in version 0.13.1 (2014-09-23)¶
This is a bug-fix release:
Fix (multiple) inheritance of
future.builtins.object
with metaclasses (Issues #91, #96)Fix
futurize
’s refactoring ofurllib
imports (Issue #94)Fix
futurize --all-imports
(Issue #101)Fix
futurize --output-dir
logging (Issue #102)Doc formatting fix (Issues #98, #100)
Changes in version 0.13.0 (2014-08-13)¶
This is mostly a clean-up release. It adds some small new compatibility features and fixes several bugs.
Deprecations¶
The following unused internal modules are now deprecated. They will be removed in a future release:
future.utils.encoding
andfuture.utils.six
.
(Issue #80). See here for the rationale for unbundling them.
New features¶
Docs: Add Cheat Sheet: Writing Python 2-3 compatible code from Ed Schofield’s PyConAU 2014 talk.
Add
newint.to_bytes()
andnewint.from_bytes()
. (Issue #85)Add
future.utils.raise_from
as an equivalent to Py3’sraise ... from ...
syntax. (Issue #86)Add
past.builtins.oct()
function.Add backports for Python 2.6 of
subprocess.check_output()
,itertools.combinations_with_replacement()
, andfunctools.cmp_to_key()
.
Bug fixes¶
Use a private logger instead of the global logger in
future.standard_library
(Issue #82). This restores compatibility of the standard library hooks withflask
. (Issue #79)Stage 1 of
futurize
no longer renamesnext
methods to__next__
(Issue #81). It still convertsobj.next()
method calls tonext(obj)
correctly.Prevent introduction of a second set of parentheses in
print()
calls in some further cases.Fix
isinstance
checks for subclasses of future types. (Issue #89)Be explicit about encoding file contents as UTF-8 in unit tests. (Issue #63) Useful for building RPMs and in other environments where
LANG=C
.Fix for 3-argument
pow(x, y, z)
withnewint
arguments. (Thanks to @str4d.) (Issue #87)
Changes in version 0.12.4 (2014-07-18)¶
Fix upcasting behaviour of
newint
. (Issue #76)
Changes in version 0.12.3 (2014-06-19)¶
Add “official Python 3.4 support”: Py3.4 is now listed among the PyPI Trove classifiers and the tests now run successfully on Py3.4. (Issue #67)
Add backports of
collections.OrderedDict
andcollections.Counter
for Python 2.6. (Issue #52)Add
--version
option forfuturize
andpasteurize
scripts. (Issue #57)Fix
future.utils.ensure_new_type
withlong
input. (Issue #65)Remove some false alarms on checks for ambiguous fixer names with
futurize -f ...
.- Testing fixes:
Don’t hard-code Python interpreter command in tests. (Issue #62)
Fix deprecated
unittest
usage in Py3. (Issue #62)Be explicit about encoding temporary file contents as UTF-8 for when
LANG=C
(e.g., when building an RPM). (Issue #63)All undecorated tests are now passing again on Python 2.6, 2.7, 3.3, and 3.4 (thanks to Elliott Sales de Andrade).
- Docs:
Add list of fixers used by
futurize
. (Issue #58)Add list of contributors to the Credits page.
Changes in version 0.12.2 (2014-05-25)¶
Add
bytes.maketrans()
method. (Issue #51)Add support for Python versions between 2.7.0 and 2.7.3 (inclusive). (Issue #53)
Bug fix for
newlist(newlist([1, 2, 3]))
. (Issue #50)
Changes in version 0.12.1 (2014-05-14)¶
Python 2.6 support:
future.standard_library
now isolates theimportlib
dependency to one function (import_
) so theimportlib
backport may not be needed.Doc updates
Changes in version 0.12.0 (2014-05-06)¶
The major new feature in this version is improvements in the support for the reorganized standard library (PEP 3108) and compatibility of the import mechanism with 3rd-party modules.
More robust standard-library import hooks¶
Note: backwards-incompatible change: As previously announced (see Deprecated feature: auto-installation of standard-library import hooks), the import hooks must now be enabled explicitly, as follows:
from future import standard_library
with standard_library.hooks():
import html.parser
import http.client
...
This now causes these modules to be imported from future.moves
, a new
package that provides wrappers over the native Python 2 standard library with
the new Python 3 organization. As a consequence, the import hooks provided in
future.standard_library
are now fully compatible with the Requests library.
The functional interface with install_hooks()
is still supported for
backwards compatibility:
from future import standard_library
standard_library.install_hooks():
import html.parser
import http.client
...
standard_library.remove_hooks()
Explicit installation of import hooks allows finer-grained control
over whether they are enabled for other imported modules that provide their own
Python 2/3 compatibility layer. This also improves compatibility of future
with tools like py2exe
.
newobject
base object defines fallback Py2-compatible special methods¶
There is a new future.types.newobject
base class (available as
future.builtins.object
) that can streamline Py2/3 compatible code by
providing fallback Py2-compatible special methods for its subclasses. It
currently provides next()
and __nonzero__()
as fallback methods on Py2
when its subclasses define the corresponding Py3-style __next__()
and
__bool__()
methods.
This obviates the need to add certain compatibility hacks or decorators to the
code such as the @implements_iterator
decorator for classes that define a
Py3-style __next__
method.
In this example, the code defines a Py3-style iterator with a __next__
method. The object
class defines a next
method for Python 2 that maps
to __next__
:
from future.builtins import object
class Upper(object):
def __init__(self, iterable):
self._iter = iter(iterable)
def __next__(self): # note the Py3 interface
return next(self._iter).upper()
def __iter__(self):
return self
assert list(Upper('hello')) == list('HELLO')
newobject
defines other Py2-compatible special methods similarly:
currently these include __nonzero__
(mapped to __bool__
) and
__long__
(mapped to __int__
).
Inheriting from newobject
on Python 2 is safe even if your class defines
its own Python 2-style __nonzero__
and next
and __long__
methods.
Your custom methods will simply override those on the base class.
On Python 3, as usual, future.builtins.object
simply refers to builtins.object
.
past.builtins
module improved¶
The past.builtins
module is much more compatible with the corresponding
builtins on Python 2; many more of the Py2 unit tests pass on Py3. For example,
functions like map()
and filter()
now behave as they do on Py2 with with
None
as the first argument.
The past.builtins
module has also been extended to add Py3 support for
additional Py2 constructs that are not adequately handled by lib2to3
(see
Issue #37). This includes new execfile()
and cmp()
functions.
futurize
now invokes imports of these functions from past.builtins
.
surrogateescape
error handler¶
The newstr
type (future.builtins.str
) now supports a backport of the
Py3.x 'surrogateescape'
error handler for preserving high-bit
characters when encoding and decoding strings with unknown encodings.
newlist
type¶
There is a new list
type in future.builtins
that offers .copy()
and
.clear()
methods like the list
type in Python 3.
listvalues
and listitems
¶
future.utils
now contains helper functions listvalues
and
listitems
, which provide Python 2-style list snapshotting semantics for
dictionaries in both Python 2 and Python 3.
These came out of the discussion around Nick Coghlan’s now-withdrawn PEP 469.
There is no corresponding listkeys(d)
function; use list(d)
instead.
Tests¶
The number of unit tests has increased from 600 to over 800. Most of the new tests come from Python 3.3’s test suite.
Refactoring of future.standard_library.*
-> future.backports
¶
The backported standard library modules have been moved to future.backports
to make the distinction clearer between these and the new future.moves
package.
Backported http.server
and urllib
modules¶
Alpha versions of backports of the http.server
and urllib
module from
Python 3.3’s standard library are now provided in future.backports
.
Use them like this:
from future.backports.urllib.request import Request # etc.
from future.backports.http import server as http_server
Or with this new interface:
from future.standard_library import import_, from_import
Request = from_import('urllib.request', 'Request', backport=True)
http = import_('http.server', backport=True)
Internal refactoring¶
The future.builtins.types
module has been moved to future.types
.
Likewise, past.builtins.types
has been moved to past.types
. The only
user-visible effect of this is to change repr(type(obj))
for instances
of these types. For example:
>>> from future.builtins import bytes
>>> bytes(b'abc')
>>> type(b)
future.types.newbytes.newbytes
Instead of:
>>> type(b) # prior to v0.12
future.builtins.types.newbytes.newbytes
Bug fixes¶
Many small improvements and fixes have been made across the project. Some highlights are:
Fixes and updates from Python 3.3.5 have been included in the backported standard library modules.
Scrubbing of the
sys.modules
cache performed byremove_hooks()
(also called by thesuspend_hooks
andhooks
context managers) is now more conservative.
The
fix_next
andfix_reduce
fixers have been moved to stage 1 offuturize
.futurize
: Shebang lines such as#!/usr/bin/env python
and source code file encoding declarations like# -*- coding=utf-8 -*-
are no longer occasionally displaced byfrom __future__ import ...
statements. (Issue #10)Improved compatibility with
py2exe
(Issue #31).The
future.utils.bytes_to_native_str
function now returns a platform-native string object andfuture.utils.native_str_to_bytes
returns anewbytes
object on Py2. (Issue #47).The backported
http.client
module and related modules use other new backported modules such asemail
. As a result they are more compliant with the Python 3.3 equivalents.
Changes in version 0.11.4 (2014-05-25)¶
This release contains various small improvements and fixes:
This release restores Python 2.6 compatibility. (Issue #42)
The
fix_absolute_import
fixer now supports Cython.pyx
modules. (Issue #35)Right-division with
newint
objects is fixed. (Issue #38)The
fix_dict
fixer has been moved to stage2 offuturize
.Calls to
bytes(string, encoding[, errors])
now work withencoding
anderrors
passed as positional arguments. Previously this only worked ifencoding
anderrors
were passed as keyword arguments.The 0-argument
super()
function now works from inside static methods such as__new__
. (Issue #36)future.utils.native(d)
calls now work forfuture.builtins.dict
objects.
Changes in version 0.11.3 (2014-02-27)¶
This release has improvements in the standard library import hooks mechanism and its compatibility with 3rd-party modules:
Improved compatibility with requests
¶
The __exit__
function of the hooks
context manager and the
remove_hooks
function both now remove submodules of
future.standard_library
from the sys.modules
cache. Therefore this code
is now possible on Python 2 and 3:
from future import standard_library
standard_library.install_hooks()
import http.client
standard_library.remove_hooks()
import requests
data = requests.get('http://www.google.com')
Previously, this required manually removing http
and http.client
from
sys.modules
before importing requests
on Python 2.x. (Issue #19)
This change should also improve the compatibility of the standard library hooks with any other module that provides its own Python 2/3 compatibility code.
Note that the situation will improve further in version 0.12; import hooks will
require an explicit function call or the hooks
context manager.
Conversion scripts explicitly install import hooks¶
The futurize
and pasteurize
scripts now add an explicit call to
install_hooks()
to install the standard library import hooks. These scripts
now add these two lines:
from future import standard_library
standard_library.install_hooks()
instead of just the first one. The next major version of future
(0.12) will
require the explicit call or use of the hooks
context manager. This will
allow finer-grained control over whether import hooks are enabled for other
imported modules, such as requests
, which provide their own Python 2/3
compatibility code.
futurize
script no longer adds unicode_literals
by default¶
There is a new --unicode-literals
flag to futurize
that adds the
import:
from __future__ import unicode_literals
to the top of each converted module. Without this flag, futurize
now no
longer adds this import. (Issue #22)
The pasteurize
script for converting from Py3 to Py2/3 still adds
unicode_literals
. (See the comments in Issue #22 for an explanation.)
Changes in version 0.11 (2014-01-28)¶
There are several major new features in version 0.11.
past
package¶
The python-future project now provides a past
package in addition to the
future
package. Whereas future
provides improved compatibility with
Python 3 code to Python 2, past
provides support for using and interacting
with Python 2 code from Python 3. The structure reflects that of future
,
with past.builtins
and past.utils
. There is also a new
past.translation
package that provides transparent translation of Python 2
code to Python 3. (See below.)
One purpose of past
is to ease module-by-module upgrades to
codebases from Python 2. Another is to help with enabling Python 2 libraries to
support Python 3 without breaking the API they currently provide. (For example,
user code may expect these libraries to pass them Python 2’s 8-bit strings,
rather than Python 3’s bytes
object.) A third purpose is to help migrate
projects to Python 3 even if one or more dependencies are still on Python 2.
Currently past.builtins
provides forward-ports of Python 2’s str
and
dict
objects, basestring
, and list-producing iterator functions. In
later releases, past.builtins
will be used internally by the
past.translation
package to help with importing and using old Python 2
modules in a Python 3 environment.
Auto-translation of Python 2 modules upon import¶
past
provides an experimental translation
package to help
with importing and using old Python 2 modules in a Python 3 environment.
This is implemented using import hooks that attempt to automatically translate Python 2 modules to Python 3 syntax and semantics upon import. Use it like this:
$ pip3 install plotrique==0.2.5-7 --no-compile # to ignore SyntaxErrors
$ python3
Then pass in a whitelist of module name prefixes to the
past.translation.autotranslate()
function. Example:
>>> from past.translation import autotranslate
>>> autotranslate(['plotrique'])
>>> import plotrique
This is intended to help you migrate to Python 3 without the need for all
your code’s dependencies to support Python 3 yet. It should be used as a
last resort; ideally Python 2-only dependencies should be ported
properly to a Python 2/3 compatible codebase using a tool like
futurize
and the changes should be pushed to the upstream project.
For more information, see Using Python 2-only dependencies on Python 3.
Separate pasteurize
script¶
The functionality from futurize --from3
is now in a separate script called
pasteurize
. Use pasteurize
when converting from Python 3 code to Python
2/3 compatible source. For more information, see pasteurize: Py3 to Py2/3.
pow()
¶
There is now a pow()
function in future.builtins.misc
that behaves like
the Python 3 pow()
function when raising a negative number to a fractional
power (returning a complex number).
input()
no longer disabled globally on Py2¶
Previous versions of future
deleted the input()
function from
__builtin__
on Python 2 as a security measure. This was because
Python 2’s input()
function allows arbitrary code execution and could
present a security vulnerability on Python 2 if someone expects Python 3
semantics but forgets to import input
from future.builtins
. This
behaviour has been reverted, in the interests of broadening the
compatibility of future
with other Python 2 modules.
Please remember to import input
from future.builtins
if you use
input()
in a Python 2/3 compatible codebase.
Deprecated feature: auto-installation of standard-library import hooks¶
Previous versions of python-future
installed import hooks automatically upon
importing the standard_library
module from future
. This has been
deprecated in order to improve robustness and compatibility with modules like
requests
that already perform their own single-source Python 2/3
compatibility.
As of v0.12, importing future.standard_library
will no longer install import hooks by default. Instead, please install the
import hooks explicitly as follows:
from future import standard_library
standard_library.install_hooks()
And uninstall them after your import statements using:
standard_library.remove_hooks()
Note: This is a backward-incompatible change.
Internal changes¶
The internal future.builtins.backports
module has been renamed to
future.builtins.types
. This will change the repr
of future
types but not their use.
Changes in version 0.10.2 (2014-01-11)¶
New context-manager interface to standard_library.hooks
¶
There is a new context manager future.standard_library.hooks
. Use it like
this:
from future import standard_library
with standard_library.hooks():
import queue
import configserver
from http.client import HTTPConnection
# etc.
If not using this context manager, it is now encouraged to add an explicit call to
standard_library.install_hooks()
as follows:
from future import standard_library
standard_library.install_hooks()
import queue
import html
import http.client
# etc.
And to remove the hooks afterwards with:
standard_library.remove_hooks()
The functions install_hooks()
and remove_hooks()
were previously
called enable_hooks()
and disable_hooks()
. The old names are
deprecated (but are still available as aliases).
As usual, this feature has no effect on Python 3.
Changes in version 0.10.0 (2013-12-02)¶
Backported dict
type¶
future.builtins
now provides a Python 2 dict
subclass whose
keys()
, values()
, and items()
methods produce
memory-efficient iterators. On Python 2.7, these also have the same set-like
view behaviour as on Python 3. This can streamline code needing to iterate
over large dictionaries. For example:
from __future__ import print_function
from future.builtins import dict, range
squares = dict({i: i**2 for i in range(10**7)})
assert not isinstance(d.items(), list)
# Because items() is memory-efficient, so is this:
square_roots = dict((i_squared, i) for (i, i_squared) in squares.items())
For more information, see dict.
Utility functions raise_
and exec_
¶
The functions raise_with_traceback()
and raise_()
were
added to future.utils
to offer either the Python 3.x or Python 2.x
behaviour for raising exceptions. Thanks to Joel Tratner for the
contribution of these. future.utils.reraise()
is now deprecated.
A portable exec_()
function has been added to future.utils
from
six
.
Bugfixes¶
Fixed
newint.__divmod__
Improved robustness of installing and removing import hooks in
future.standard_library
v0.10.1: Fixed broken
pip install future
on Py3
Changes in version 0.9 (2013-11-06)¶
isinstance
checks are supported natively with backported types¶
The isinstance
function is no longer redefined in future.builtins
to operate with the backported int
, bytes
and str
.
isinstance
checks with the backported types now work correctly by
default; we achieve this through overriding the __instancecheck__
method of metaclasses of the backported types.
For more information, see isinstance.
futurize
: minimal imports by default¶
By default, the futurize
script now only adds the minimal set of
imports deemed necessary.
There is now an --all-imports
option to the futurize
script which
gives the previous behaviour, which is to add all __future__
imports
and from future.builtins import *
imports to every module. (This even
applies to an empty __init__.py
file.)
Looser type-checking for the backported str
object¶
Now the future.builtins.str
object behaves more like the Python 2
unicode
object with regard to type-checking. This is to work around some
bugs / sloppiness in the Python 2 standard library involving mixing of
byte-strings and unicode strings, such as os.path.join
in posixpath.py
.
future.builtins.str
still raises the expected TypeError
exceptions from
Python 3 when attempting to mix it with future.builtins.bytes
.
suspend_hooks()
context manager added to future.standard_library
¶
Pychecker (as of v0.6.1)’s checker.py
attempts to import the builtins
module as a way of determining whether Python 3 is running. Since this
succeeds when from future import standard_library
is in effect, this
check does not work and pychecker sets the wrong value for its internal PY2
flag is set.
To work around this, future
now provides a context manager called
suspend_hooks
that can be used as follows:
from future import standard_library
...
with standard_library.suspend_hooks():
from pychecker.checker import Checker
Changes in version 0.8 (2013-10-28)¶
Python 2.6 support¶
future
now includes support for Python 2.6.
To run the future
test suite on Python 2.6, this additional package is needed:
pip install unittest2
http.server
also requires the argparse
package:
pip install argparse
Unused modules removed¶
The future.six
module has been removed. future
doesn’t require six
(and hasn’t since version 0.3). If you need support for Python versions before
2.6, six
is the best option. future
and six
can be installed
alongside each other easily if needed.
The unused hacks
module has also been removed from the source tree.
isinstance()
added to future.builtins
(v0.8.2)¶
It is now possible to use isinstance()
calls normally after importing isinstance
from
future.builtins
. On Python 2, this is specially defined to be compatible with
future
’s backported int
, str
, and bytes
types, as well as
handling Python 2’s int
/long
distinction.
The result is that code that uses isinstance
to perform type-checking of
ints, strings, and bytes should now work identically on Python 2 as on Python 3.
The utility functions isint
, istext
, and isbytes
provided before for
compatible type-checking across Python 2 and 3 in future.utils
are now
deprecated.
Summary of all changes¶
- v0.15.0:
Full backports of
urllib.parse
and otherurllib
submodules are exposed byinstall_aliases()
.tkinter.ttk
supportInitial
surrogateescape
supportAdditional backports:
collections
,http
constants, etc.Bug fixes
- v0.14.3:
Bug fixes
- v0.14.2:
Bug fixes
- v0.14.1:
Bug fixes
- v0.14.0:
New top-level
builtins
package on Py2 for cleaner imports. Equivalent tofuture.builtins
New top-level packages on Py2 with the same names as Py3 standard modules:
configparser
,copyreg
,html
,http
,xmlrpc
,winreg
- v0.13.1:
Bug fixes
- v0.13.0:
Cheat sheet for writing Python 2/3 compatible code
to_int
andfrom_int
methods fornewbytes
Bug fixes
- v0.12.0:
Add
newobject
andnewlist
typesImprove compatibility of import hooks with
Requests
,py2exe
No more auto-installation of import hooks by
future.standard_library
New
future.moves
packagepast.builtins
improvednewstr.encode(..., errors='surrogateescape')
supportedRefactoring:
future.standard_library
submodules ->future.backports
Refactoring:
future.builtins.types
->future.types
Refactoring:
past.builtins.types
->past.types
New
listvalues
andlistitems
functions infuture.utils
Many bug fixes to
futurize
,future.builtins
, etc.
- v0.11.4:
Restore Py2.6 compatibility
- v0.11.3:
The
futurize
andpasteurize
scripts add an explicit call tofuture.standard_library.install_hooks()
whenever modules affected by PEP 3108 are imported.The
future.builtins.bytes
constructor now acceptsfrozenset
objects as on Py3.
- v0.11.2:
The
past.translation.autotranslate
feature now finds modules to import more robustly and works with Python eggs.
- v0.11.1:
Update to
requirements_py26.txt
for Python 2.6. Small updates to docs and tests.
- v0.11:
New
past
package withpast.builtins
andpast.translation
modules.
- v0.10.2:
Improvements to stdlib hooks. New context manager:
future.standard_library.hooks()
.New
raise_
andraise_with_traceback
functions infuture.utils
.
- v0.10:
New backported
dict
object with set-likekeys
,values
,items
- v0.9:
isinstance()
hack removed in favour of__instancecheck__
on the metaclasses of the backported typesfuturize
now only adds necessary imports by defaultLooser type-checking by
future.builtins.str
when combining with Py2 native byte-strings.
- v0.8.3:
New
--all-imports
option tofuturize
Fix bug with
str.encode()
with encoding as a non-keyword arg
- v0.8.2:
New
isinstance
function infuture.builtins
. This obviates and deprecates the utility functions for type-checking infuture.utils
.
- v0.8.1:
Backported
socketserver.py
. Fixes sporadic test failures withhttp.server
(related to threading and old-style classes used in Py2.7’sSocketServer.py
).Move a few more safe
futurize
fixes from stage2 to stage1Bug fixes to
future.utils
- v0.8:
Added Python 2.6 support
Removed unused modules:
future.six
andfuture.hacks
Removed undocumented functions from
future.utils
- v0.7:
Added a backported Py3-like
int
object (inherits fromlong
).Added utility functions for type-checking and docs about
isinstance
uses/alternatives.Fixes and stricter type-checking for
bytes
andstr
objectsAdded many more tests for the
futurize
scriptWe no longer disable obsolete Py2 builtins by default with
from future.builtins import *
. Usefrom future.builtins.disabled import *
instead.
- v0.6:
Added a backported Py3-like
str
object (inherits from Py2’sunicode
)Removed support for the form
from future import *
; usefrom future.builtins import *
instead
- v0.5.3:
Doc improvements
- v0.5.2:
Add lots of docs and a Sphinx project
- v0.5.1:
Upgraded included
six
module (included asfuture.utils.six
) to v1.4.1http.server
module backportedbytes.split()
and.rsplit()
bugfixes
- v0.5.0:
Added backported Py3-like
bytes
object
- v0.4.2:
Various fixes
- v0.4.1:
- v0.4.0:
Added various useful compatibility functions to
future.utils
Reorganized package: moved all builtins to
future.builtins
; moved all stdlib things tofuture.standard_library
Renamed
python-futurize
console script tofuturize
Moved
future.six
tofuture.utils.six
and pulled the most relevant definitions tofuture.utils
.More improvements to “Py3 to both” conversion (
futurize.py --from3
)
- v0.3.5:
Fixed broken package setup (“package directory ‘libfuturize/tests’ does not exist”)
- v0.3.4:
Added
itertools.zip_longest
Updated
2to3_backcompat
tests to usefuturize.py
Improved
libfuturize
fixers: correct order of imports; add imports only when necessary (exceptabsolute_import
currently)
- v0.3.3:
Added
python-futurize
console scriptAdded
itertools.filterfalse
Removed docs about unfinished backports (
urllib
etc.)Removed old Py2 syntax in some files that breaks py3
setup.py install
- v0.3.2:
Added
test.support
moduleAdded
UserList
,UserString
,UserDict
classes tocollections
moduleRemoved
int
->long
mappingAdded backported
_markupbase.py
etc. with new-style classes to fix travis-ci build problemsAdded working
html
andhttp.client
backported modules
- v0.3.0:
Generalized import hooks to allow dotted imports
Added backports of
urllib
,html
,http
modules from Py3.3 stdlib usingfuture
Added
futurize
script for automatically turning Py2 or Py3 modules into cross-platform Py3 modulesRenamed
future.standard_library_renames
tofuture.standard_library
. (No longer just renames, but backports too.)
- v0.2.2.1:
Small bug fixes to get tests passing on travis-ci.org
- v0.2.1:
Small bug fixes
- v0.2.0:
Features
module renamed tomodified_builtins
No more namespace pollution as a policy:
from future import *
should have no effect on Python 3. On Python 2, it only shadows the builtins; it doesn’t introduce any new names.
End-to-end tests with Python 2 code and
2to3
now work
- v0.1.0:
first version with tests!
removed the inspect-module magic
- v0.0.x:
initial releases. Use at your peril.