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 unicode
da __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.