¡Unicode en Python es Divertido!
Sin embargo, hay una trampa. Tenés que estar absolutamente seguro que la cosa que estás decodeando es un string de bytes, y no un objeto unicode. Porque los objetos unicode tienen un método decode pero es totalmente inútil, y su único propósito en la vida es causar este error peculiar:
>>> u'á'.decode('utf8') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 0: ordinal not in range(128)
¿Porqué es peculiar? Porque es un error de Encode. Causado por llamar a decode. Lo que pasa es que en los objetos unicode, decode, en la práctica es algo así:
El usuario quiere un objeto unicode. Él tiene un objeto unicde. Por definición, no existe un cosa que sea "decodear como utf-8 un objeto unicode". No tiene sentido. Es como peinar un pescado, o escalar una laguna.
¡Lo que debería devolver es self
! Además es suamente molesto que la
única manera de evitar el error es chequear el tipo del objeto, lo que es
activamente antipitónico.
Aún mejor, no tengamos un método decode en objetos unicode, que creo es la situación en python 3, pero nunca lo va a ser en python 2.
Así que ahora ya saben, y buena suerte.
supongo que no quiere devolver "self" por que decode tiene que devolver "OTRO" objeto unicode deberia devolver unicode(self)
Los objetos unicode son inmutables, así que no veo una diferencia práctica entre self y unicode(self)...
practica inmediata seria que no rompa una validacion "is not" futura
Si estás validando strings usando "is" merecés que te falle :-)
no pense en validar string con "is" pense en validar dos referencias al posible mismo objeto con "is" (osea pa lo que sirve is)
igual str hace lo mismo.... pero no me gusta
No hay objetos unicode en Python 3, solo str's (que tienen encode) y bytes (que tienen decode).
Si, los str en python 3 son unicode. Gracias por la aclaracion.
OT: para snippets chicos como los de hoy la zona del fin del code mas las siguientes lineas de texto normal no lucen del todo bien;
Si quisieras que la linea en blanco al final del .. code quedara fuera del block habria alguna manera sencilla de indicarlo en reST ?
habría que revisar un cachito el CSS, debe ser un padding mal puesto nomas.