Python 2: Implemente solo __str __ () y devuelva un Unicode.
Cuando __unicode__()
se omite y alguien llama unicode(o)
o u"%s"%o
, Python llama o.__str__()
y convierte a unicode usando la codificación del sistema. (Ver documentación de__unicode__()
.)
Lo contrario no es verdad. Si implementa __unicode__()
pero no __str__()
, cuando alguien llama str(o)
o "%s"%o
, Python regresa repr(o)
.
Razón fundamental
¿Por qué sería trabajar para volver a unicode
partir de __str__()
?
Si __str__()
devuelve un Unicode, Python lo convierte automáticamente para str
usar la codificación del sistema.
Cual es el beneficio?
① Le libera de preocuparse acerca de cuál es la codificación del sistema (es decir, locale.getpreferredencoeding(…)
). No solo es desordenado, personalmente, sino que creo que es algo de lo que el sistema debería ocuparse de todos modos. ② Si tiene cuidado, su código puede ser incompatible con Python 3, en el que se __str__()
devuelve unicode.
¿No es engañoso devolver un unicode de una función llamada __str__()
?
Un poco. Sin embargo, es posible que ya lo estés haciendo. Si tiene from __future__ import unicode_literals
la parte superior de su archivo, es muy probable que devuelva un Unicode sin siquiera saberlo.
¿Qué hay de Python 3?
Python 3 no usa __unicode__()
. Sin embargo, si implementa de __str__()
manera que devuelva unicode en Python 2 o Python 3, esa parte de su código será compatible.
¿Qué pasa si quiero unicode(o)
ser sustancialmente diferente de str()
?
Implemente ambos __str__()
(posiblemente regresando str
) y __unicode__()
. Me imagino que esto sería raro, pero es posible que desee una salida sustancialmente diferente (por ejemplo, versiones ASCII de caracteres especiales, como ":)"
for u"☺"
).
Me doy cuenta de que algunos pueden encontrar esto controvertido.