Skip to content

Commit

Permalink
[py3] Added python_2_unicode_compatible decorator.
Browse files Browse the repository at this point in the history
  • Loading branch information
aaugustin committed Aug 12, 2012
1 parent e7e08fd commit a0a0203
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
13 changes: 13 additions & 0 deletions django/utils/encoding.py
Expand Up @@ -39,6 +39,19 @@ def __str__(self):
def __str__(self):
return self.__unicode__().encode('utf-8')

def python_2_unicode_compatible(klass):
"""
A decorator that defines __unicode__ and __str__ methods under Python 2.
Under Python 3 it does nothing.
To support Python 2 and 3 with a single code base, define a __str__ method
returning text and apply this decorator to the class.
"""
if not six.PY3:
klass.__unicode__ = klass.__str__
klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
return klass

def smart_text(s, encoding='utf-8', strings_only=False, errors='strict'):
"""
Returns a text object representing 's' -- unicode on Python 2 and str on
Expand Down
8 changes: 8 additions & 0 deletions docs/ref/utils.txt
Expand Up @@ -187,6 +187,14 @@ The functions defined in this module share the following properties:
Useful as a mix-in. If you support Python 2 and 3 with a single code base,
you can inherit this mix-in and just define ``__unicode__``.

.. function:: python_2_unicode_compatible

A decorator that defines ``__unicode__`` and ``__str__`` methods under
Python 2. Under Python 3 it does nothing.

To support Python 2 and 3 with a single code base, define a ``__str__``
method returning text and apply this decorator to the class.

.. function:: smart_text(s, encoding='utf-8', strings_only=False, errors='strict')

.. versionadded:: 1.5
Expand Down

0 comments on commit a0a0203

Please sign in to comment.