This is a pre-production deployment of Warehouse. Changes made here affect the production instance of PyPI (
Help us improve Python packaging - Donate today!

[Experimental] Run Python 2 code from Python 3

Project Description

past is a package to aid with Python 2/3 compatibility. Whereas future contains backports of Python 3 constructs to Python 2, past provides implementations of some Python 2 constructs in Python 3. It is intended to be used sparingly, as a way of running old Python 2 code from Python 3 until it is ported properly.

Potential uses for libraries:

  • as a step in porting a Python 2 codebase to Python 3 (e.g. with the futurize script)
  • to provide Python 3 support for previously Python 2-only libraries with the same APIs as on Python 2 – particularly with regard to 8-bit strings (the past.builtins.str type).
  • to aid in providing minimal-effort Python 3 support for applications using libraries that do not yet wish to upgrade their code properly to Python 3, or wish to upgrade it gradually to Python 3 style.

To install past, use:

$ pip install future

Here are some examples that run identically on Python 3 and 2:

>>> from past.builtins import (str as oldstr, range, reduce,
                               raw_input, xrange)

>>> philosopher = oldstr(u'孔子'.encode('utf-8'))
>>> # This now behaves like a Py2 byte-string on both Py2 and Py3.
>>> # For example, indexing returns a Python 2-like string object, not
>>> # an integer:
>>> philosopher[0]
>>> type(philosopher[0])

>>> # The div() function behaves like Python 2's / operator
>>> # without "from __future__ import division"
>>> from past.utils import div
>>> div(3, 2)    # like 3/2 in Py2
>>> div(3, 2.0)  # like 3/2.0 in Py2

>>> # List-producing versions of range, reduce, map, filter
>>> from past.builtins import range, reduce
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])

>>> # Other functions removed in Python 3 are resurrected ...
>>> from past.builtins import execfile
>>> execfile('')

>>> from past.builtins import raw_input
>>> name = raw_input('What is your name? ')
What is your name? [cursor]

>>> from past.builtins import reload
>>> reload(mymodule)   # equivalent to imp.reload(mymodule) in Python 3

>>> from past.builtins import xrange
>>> for i in xrange(10):
...     pass

It also provides experimental import hooks so you can import and run Python 2 modules from Python 3:

>>> from past import autotranslate
>>> autotranslate('mypy2module')

>>> import mypy2module




Author:Ed Schofield
Sponsor:Python Charmers Pty Ltd, Australia:


Copyright 2013-2014 Python Charmers Pty Ltd, Australia. The software is distributed under an MIT licence. See LICENSE.txt.

Release History

Release History

This version
History Node


Supported By

WebFaction WebFaction Technical Writing Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Rackspace Rackspace Cloud Servers DreamHost DreamHost Log Hosting