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 unicodedari __str__()?
Jika __str__()mengembalikan unicode, Python secara otomatis mengubahnya menjadi strmenggunakan 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_literalsdi 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.