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 django-developers@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.

Reply via email to