¿Existe una convención de Python sobre cuándo debe implementar __str__()
versus __unicode__()
? He visto que las clases se anulan con __unicode__()
más frecuencia __str__()
pero no parece ser consistente. ¿Existen reglas específicas cuando es mejor implementar una versus la otra? ¿Es necesario / una buena práctica implementar ambos?
fuente
__unicode__
y luego lo hacestr(obj)
?unicode
plantea unNameError
Python 3, ¿es un patrón simple que funciona tanto en 2 como en 3?future
paquete también proporcionapython_2_unicode_compatible
sin tener Django como dependencia.Si no me importara especialmente la cadena de micro-optimización para una clase dada, siempre la implementaría
__unicode__
solo, ya que es más general. Cuando me preocupo por esos problemas de rendimiento minuciosos (que es la excepción, no la regla), tener__str__
solo (cuando puedo probar que nunca habrá caracteres no ASCII en la salida en cadena) o ambos (cuando ambos son posibles), podría ayuda.Creo que estos son principios sólidos, pero en la práctica es muy común SABER que no habrá más que caracteres ASCII sin hacer un esfuerzo para demostrarlo (por ejemplo, la forma en cadena solo tiene dígitos, puntuación y quizás un nombre ASCII corto ;-) en el que en caso de que sea bastante típico pasar directamente al
__str__
enfoque "justo " (pero si un equipo de programación con el que trabajé propusiera una directriz local para evitar eso, estaría +1 en la propuesta, ya que es fácil equivocarse en estos asuntos Y "La optimización prematura es la raíz de todo mal en la programación" ;-).fuente
Con el mundo cada vez más pequeño, es probable que cualquier cadena que encuentre contenga Unicode eventualmente. Entonces, para cualquier aplicación nueva, al menos debe proporcionar
__unicode__()
. Si usted también anula__str__()
es solo una cuestión de gustos.fuente
Si está trabajando en python2 y python3 en Django, le recomiendo el decorador compatible python_2_unicode_compatible:
Como se señaló en los comentarios anteriores a otra respuesta, algunas versiones de future.utils también admiten este decorador. En mi sistema, necesitaba instalar un módulo futuro más nuevo para python2 e instalar future para python3. Después de eso, aquí hay un ejemplo funcional:
Aquí hay un ejemplo de salida (donde venv2 / venv3 son instancias virtualenv):
fuente
Python 2: Implemente solo __str __ () y devuelva un Unicode.
Cuando
__unicode__()
se omite y alguien llamaunicode(o)
ou"%s"%o
, Python llamao.__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 llamastr(o)
o"%s"%o
, Python regresarepr(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 parastr
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 destr()
?Implemente ambos
__str__()
(posiblemente regresandostr
) 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":)"
foru"☺"
).Me doy cuenta de que algunos pueden encontrar esto controvertido.
fuente
Vale la pena señalar a aquellos que no están familiarizados con la
__unicode__
función algunos de los comportamientos predeterminados que lo rodean en Python 2.x, especialmente cuando se definen junto con__str__
.produce la siguiente salida de consola ...
Ahora cuando descomento el
__str__
métodofuente