Hi Jon,

On 09/18/2014 02:01 PM, Jon Dufresne wrote:
> In my Django application, I'm making a strong attempt to always deal
> with Unicode strings at the application layer. Byte strings are only
> handled at the protocol layer -- sending data out on the "wire". If my
> application tests if an object is a string, I'll use isinstance(obj,
> unicode) (Python2).
> 
> One gotcha that I noticed is that reverse() will always return a byte
> string. Tracing this through the code, I see this happens during the
> call to iri_to_uri(), as this function creates a string consisting
> only of ASCII characters, other characters are escaped.
> 
> Now, reverse() is often used to grab a URL and handle it at the
> application layer. It is not reserved only for the protocol layer. An
> example would be presenting a URL inside a HTML template, (as an href
> or as text), mail, or JSON.
> 
> In my opinion, reverse() should return a Unicode string, even if that
> string consists only of ASCII characters. It is not until the string
> hits the wire that it ought to be forced to bytes.
> 
> To verify this, I have created a unit test that I placed in
> "urlpatterns_reverse.tests.URLPatternReverse" to demonstrate this is
> at the Django layer.
> 
>     def test_reverse_unicode(self):
>         name, expected, args, kwargs = test_data[0]
>         self.assertIsInstance(
>             reverse(name, args=args, kwargs=kwargs),
>             six.text_type)
> 
> What do you think? If others agree, I can file a bug and create a pull
> request to fix this.

It makes sense to me that `reverse()` should return a text (unicode)
string. A URL may be "just bytes" on the network, but within the Django
context it is clearly text.

I'm a bit concerned about the backwards-compatibility implications,
particularly for Python 3 projects where `bytes` and `str` don't
silently interoperate. It would be really interesting to hear if anyone
on this list has a real-world Python 3 Django project handy and could
test the impact of this change.

Carl

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/541B4A79.9020109%40oddbird.net.
For more options, visit https://groups.google.com/d/optout.

Reply via email to