49 lines
1.6 KiB
ReStructuredText
49 lines
1.6 KiB
ReStructuredText
.. _utilities-guide:
|
|
|
|
Utilities
|
|
---------
|
|
|
|
:mod:`future` also provides some useful functions and decorators to ease
|
|
backward compatibility with Py2 in the :mod:`future.utils` and
|
|
:mod:`past.utils` modules. These are a selection of the most useful functions
|
|
from ``six`` and various home-grown Py2/3 compatibility modules from popular
|
|
Python projects, such as Jinja2, Pandas, IPython, and Django. The goal is to
|
|
consolidate these in one place, tested and documented, obviating the need for
|
|
every project to repeat this work.
|
|
|
|
Examples::
|
|
|
|
# Functions like print() expect __str__ on Py2 to return a byte
|
|
# string. This decorator maps the __str__ to __unicode__ on Py2 and
|
|
# defines __str__ to encode it as utf-8:
|
|
|
|
from future.utils import python_2_unicode_compatible
|
|
|
|
@python_2_unicode_compatible
|
|
class MyClass(object):
|
|
def __str__(self):
|
|
return u'Unicode string: \u5b54\u5b50'
|
|
a = MyClass()
|
|
|
|
# This then prints the Chinese characters for Confucius:
|
|
print(a)
|
|
|
|
|
|
# Iterators on Py3 require a __next__() method, whereas on Py2 this
|
|
# is called next(). This decorator allows Py3-style iterators to work
|
|
# identically on Py2:
|
|
|
|
@implements_iterator
|
|
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
|
|
|
|
print(list(Upper('hello')))
|
|
# prints ['H', 'E', 'L', 'L', 'O']
|
|
|
|
On Python 3 these decorators are no-ops.
|