Python 2: Implementasikan __str __ () saja, dan kembalikan unicode.
Ketika __unicode__()
dihilangkan dan seseorang memanggil unicode(o)
atau u"%s"%o
, Python memanggil o.__str__()
dan mengkonversi ke unicode menggunakan pengkodean sistem. (Lihat dokumentasi__unicode__()
.)
Yang sebaliknya tidak benar. Jika Anda menerapkan __unicode__()
tetapi tidak __str__()
, maka ketika seseorang memanggil str(o)
atau "%s"%o
, Python kembali repr(o)
.
Alasan
Mengapa akan berhasil mengembalikan unicode
dari __str__()
?
Jika __str__()
mengembalikan unicode, Python secara otomatis mengubahnya menjadi str
menggunakan sistem pengkodean.
Apa untungnya?
① Ini membebaskan Anda dari khawatir tentang apa pengkodean sistem itu (yaitu, locale.getpreferredencoeding(…)
). Tidak hanya berantakan, secara pribadi, tapi saya pikir itu adalah sesuatu yang harus dijaga sistem. ② Jika Anda berhati-hati, kode Anda mungkin keluar kompatibel dengan Python 3, di mana __str__()
mengembalikan unicode.
Bukankah menipu untuk mengembalikan unicode dari fungsi yang disebut __str__()
?
Sedikit. Namun, Anda mungkin sudah melakukannya. Jika Anda memiliki from __future__ import unicode_literals
di bagian atas file Anda, ada kemungkinan besar Anda mengembalikan unicode tanpa menyadarinya.
Bagaimana dengan Python 3?
Python 3 tidak digunakan __unicode__()
. Namun, jika Anda menerapkannya __str__()
sehingga mengembalikan unicode di bawah Python 2 atau Python 3, maka bagian dari kode Anda akan kompatibel lintas.
Bagaimana jika saya ingin unicode(o)
berbeda secara substansial str()
?
Terapkan baik __str__()
(mungkin kembali str
) dan __unicode__()
. Saya membayangkan ini akan jarang terjadi, tetapi Anda mungkin ingin keluaran yang berbeda secara substansial (misalnya, versi ASCII karakter khusus, seperti ":)"
untuk u"☺"
).
Saya menyadari beberapa orang mungkin menemukan ini kontroversial.