Apakah ada konvensi python ketika Anda harus mengimplementasikan __str__()
versus __unicode__()
. Saya telah melihat kelas menimpa __unicode__()
lebih sering daripada __str__()
tetapi tampaknya tidak konsisten. Apakah ada aturan khusus ketika lebih baik menerapkan satu versus yang lain? Apakah perlu / praktik yang baik untuk mengimplementasikan keduanya?
sumber
__unicode__
dan kemudian melakukannyastr(obj)
?unicode
menimbulkanNameError
pada Python 3, apakah pola sederhana yang bekerja di kedua 2 dan 3?future
paket ini juga menyediakanpython_2_unicode_compatible
tanpa harus Django sebagai ketergantungan.Jika saya tidak terlalu peduli tentang pengoptimalan pengoptimalan mikro untuk kelas tertentu, saya akan selalu menerapkannya
__unicode__
saja, karena ini lebih umum. Ketika saya peduli tentang masalah kinerja menit seperti itu (yang merupakan pengecualian, bukan aturan), memiliki__str__
hanya (ketika saya bisa membuktikan tidak akan ada karakter non-ASCII dalam output yang dirangkai) atau keduanya (jika keduanya mungkin), mungkin Tolong.Ini menurut saya adalah prinsip yang kuat, tetapi dalam praktiknya sangat umum TAHU tidak akan ada apa-apa selain karakter ASCII tanpa melakukan upaya untuk membuktikannya (mis. Formulir yang dikurifikasi hanya memiliki angka, tanda baca, dan mungkin nama ASCII pendek ;-) di mana Kasus itu cukup khas untuk pindah langsung ke pendekatan "adil
__str__
" (tetapi jika tim pemrograman saya bekerja dengan mengusulkan pedoman lokal untuk menghindari itu, saya akan menjadi +1 pada proposal, karena mudah salah dalam hal ini DAN "optimisasi prematur adalah akar dari semua kejahatan dalam pemrograman" ;-).sumber
Dengan dunia semakin kecil, kemungkinan bahwa setiap string yang Anda temui akan mengandung Unicode pada akhirnya. Jadi untuk semua aplikasi baru, Anda setidaknya harus menyediakan
__unicode__()
. Apakah Anda juga menimpa__str__()
itu hanya masalah selera.sumber
Jika Anda bekerja di python2 dan python3 di Django, saya sarankan dekorator yang kompatibel python_2_unicode_compatible:
Seperti disebutkan dalam komentar sebelumnya untuk jawaban lain, beberapa versi future.utils juga mendukung dekorator ini. Di sistem saya, saya perlu menginstal modul masa depan yang lebih baru untuk python2 dan menginstal masa depan untuk python3. Setelah itu, maka berikut adalah contoh fungsionalnya:
Berikut adalah contoh output (di mana venv2 / venv3 adalah instance virtualenv):
sumber
Python 2: Implementasikan __str __ () saja, dan kembalikan unicode.
Ketika
__unicode__()
dihilangkan dan seseorang memanggilunicode(o)
atauu"%s"%o
, Python memanggilo.__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 memanggilstr(o)
atau"%s"%o
, Python kembalirepr(o)
.Alasan
Mengapa akan berhasil mengembalikan
unicode
dari__str__()
?Jika
__str__()
mengembalikan unicode, Python secara otomatis mengubahnya menjadistr
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 substansialstr()
?Terapkan baik
__str__()
(mungkin kembalistr
) dan__unicode__()
. Saya membayangkan ini akan jarang terjadi, tetapi Anda mungkin ingin keluaran yang berbeda secara substansial (misalnya, versi ASCII karakter khusus, seperti":)"
untuku"☺"
).Saya menyadari beberapa orang mungkin menemukan ini kontroversial.
sumber
Ada baiknya menunjukkan kepada mereka yang tidak terbiasa dengan
__unicode__
fungsi beberapa perilaku default yang mengelilinginya kembali di Python 2.x, terutama ketika didefinisikan berdampingan dengan__str__
.menghasilkan output konsol berikut ...
Sekarang ketika saya batalkan komentar
__str__
metodesumber