| |
| """ |
| past: compatibility with Python 2 from Python 3 |
| =============================================== |
| |
| ``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 and tools to import and |
| run Python 2 code in Python 3. It is intended to be used sparingly, as a way of |
| running old Python 2 code from Python 3 until the code 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. |
| |
| |
| Here are some code examples that run identically on Python 3 and 2:: |
| |
| >>> from past.builtins import str as oldstr |
| |
| >>> philosopher = oldstr(u'\u5b54\u5b50'.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] |
| '\xe5' |
| >>> type(philosopher[0]) |
| <past.builtins.oldstr> |
| |
| >>> # 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]) |
| 15 |
| |
| >>> # Other functions removed in Python 3 are resurrected ... |
| >>> from past.builtins import execfile |
| >>> execfile('myfile.py') |
| |
| >>> 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 import hooks so you can import and use Python 2 modules like |
| this:: |
| |
| $ python3 |
| |
| >>> from past.translation import autotranslate |
| >>> authotranslate('mypy2module') |
| >>> import mypy2module |
| |
| until the authors of the Python 2 modules have upgraded their code. Then, for |
| example:: |
| |
| >>> mypy2module.func_taking_py2_string(oldstr(b'abcd')) |
| |
| |
| Credits |
| ------- |
| |
| :Author: Ed Schofield, Jordan M. Adler, et al |
| :Sponsor: Python Charmers: https://pythoncharmers.com |
| |
| |
| Licensing |
| --------- |
| Copyright 2013-2024 Python Charmers, Australia. |
| The software is distributed under an MIT licence. See LICENSE.txt. |
| """ |
|
|
| from future import __version__, __copyright__, __license__ |
|
|
| __title__ = 'past' |
| __author__ = 'Ed Schofield' |
|
|