I think this will only be an issue for django application maintainers.
IMHO, projects target a specific version of python and won't have to
provide python 2-3 compatibility. Am I wrong?
Le jeudi 9 août 2012 16:36:12 UTC-4, Aymeric Augustin a écrit :
>
> Hello,
>
> One of the first lessons in the tutorial is to define a __unicode__
> method. In Python 3, __unicode__ is replaced by __str__ (and __str__ by
> __bytes__, but that method won't be needed in general).
>
> Writing these methods in a way works on both Python 2 and 3 proves
> surprisingly messy. I'd like some feedback before choosing a technique,
> applying it to Django, and documenting it.
>
> Here are a few proposals. Which one do you prefer? Do you have better
> ideas?
>
>
> * Proposal 1 — the very explicit way
> + explicit
> + no runtime overhead
> - not DRY
> - much boilerplate code
>
> from __future__ import unicode_literals
> from django.utils import six
>
> class MyClass(object):
> if six.PY3:
> def __str__(self):
> return "text ..."
> else:
> def __str__(self):
> return self.__unicode__().encode('utf-8')
> def __unicode__(self):
> return "text ..."
>
>
> * Proposal 2 — the Python 3 way
> + explicit
> + no runtime overhead
> - 3 lines of boilerplate code
>
> from __future__ import unicode_literals
> from django.utils import six
>
> class MyClass(object):
> def __str__(self):
> return "text ..."
> if not six.PY3:
> __unicode__ = __str__
> __str__ = lambda self: self.__unicode__().encode('utf-8')
>
>
> * Proposal 3 — the magic mixin
> + no boilerplate code
> - not explicit
> - requires writing a __unicode__ method which was removed in Python 3:
> this is non-educational for Python 2 programmers learning Python 3 and
> complete nonsense for Python 3 programmers who have never been exposed to
> Python 2.
>
> from __future__ import unicode_literals
> from django.utils.encoding import StrAndUnicode
>
> class MyClass(StrAndUnicode, object):
> def __unicode__(self):
> return "text ..."
>
>
> * Proposal 4 — the non-unicode way
> - on Python 2, __unicode__ performs an unnecessary encode / decode
> - on Python 2, __unicode__ will fail if the system encoding isn't utf-8
> (which may happen for a variety of reasons)
>
> from __future__ import unicode_literals
> from django.utils import six
>
> class MyClass(object):
> def __str__(self):
> result = "text ..."
> if six.PY3:
> result = result.encode('utf-8')
> return result
>
>
> At this point I tend to prefer the version 2, because it's explicit, short
> and in line with our goal to write Python 3 code that also works on Python
> 2. What about you?
>
> Best regards,
>
> --
> Aymeric.
>
--
You received this message because you are subscribed to the Google Groups
"Django developers" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/django-developers/-/CcOTSuguvyAJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-developers?hl=en.