Python 2: implementa solo __str __ () e restituisce un unicode.
Quando __unicode__()viene omesso e qualcuno chiama unicode(o)o u"%s"%o, Python chiama o.__str__()e si converte in unicode usando la codifica di sistema. (Vedi documentazione di__unicode__() .)
Non è vero il contrario. Se implementate __unicode__()ma non __str__(), quando qualcuno chiama str(o)o "%s"%o, Python ritorna repr(o).
Fondamento logico
Perché dovrebbe funzionare per restituire un unicodeda __str__()?
Se __str__()restituisce un unicode, Python lo converte automaticamente instr usando la codifica del sistema.
Qual è il vantaggio?
① Ti libera dal preoccuparti di quale sia la codifica del sistema (cioè, locale.getpreferredencoeding(…)). Non solo è disordinato, personalmente, ma penso che sia qualcosa di cui il sistema dovrebbe occuparsi comunque. ② Se stai attento, il tuo codice potrebbe risultare compatibile con Python 3, in cui__str__() restituisce Unicode.
Non è ingannevole restituire un unicode da una funzione chiamata __str__()?
Un po. Tuttavia, potresti già farlo. Se haifrom __future__ import unicode_literals nella parte superiore del tuo file, c'è una buona probabilità che tu restituisca un unicode senza nemmeno saperlo.
Che dire di Python 3?
Python 3 non utilizza __unicode__(). Tuttavia, se si implementa__str__() modo tale da restituire Unicode in Python 2 o Python 3, quella parte del codice sarà compatibile con la compatibilità incrociata.
E se volessi unicode(o)essere sostanzialmente diverso da str()?
Implementa entrambi __str__()(possibilmente tornando str) e __unicode__(). Immagino che questo sarebbe raro, ma potresti volere risultati sostanzialmente diversi (ad es. Versioni ASCII di caratteri speciali, come ":)"per u"☺").
Mi rendo conto che alcuni potrebbero trovarlo controverso.