Python 2: Chỉ triển khai __str __ () và trả về một unicode.
Khi __unicode__()
bị bỏ qua và ai đó gọi unicode(o)
hoặc u"%s"%o
, Python gọi o.__str__()
và chuyển đổi thành unicode bằng mã hóa hệ thống. (Xem tài liệu của__unicode__()
.)
Điều ngược lại là không đúng sự thật. Nếu bạn thực hiện __unicode__()
nhưng không __str__()
, thì khi ai đó gọi str(o)
hoặc "%s"%o
, Python trả về repr(o)
.
Cơ sở lý luận
Tại sao nó hoạt động để trả lại unicode
từ __str__()
?
Nếu __str__()
trả về một unicode, Python sẽ tự động chuyển đổi nó thành str
sử dụng mã hóa hệ thống.
Lợi ích là gì?
Nó giải phóng bạn khỏi lo lắng về việc mã hóa hệ thống là gì (nghĩa là locale.getpreferredencoeding(…)
). Cá nhân tôi không chỉ lộn xộn, mà tôi nghĩ đó là điều mà hệ thống nên quan tâm. Nếu bạn cẩn thận, mã của bạn có thể tương thích chéo với Python 3, trong đó __str__()
trả về unicode.
Không phải là lừa dối để trả về một unicode từ một hàm được gọi __str__()
sao?
Một chút. Tuy nhiên, bạn có thể đã làm điều đó. Nếu bạn có from __future__ import unicode_literals
ở đầu tệp của mình, rất có thể bạn sẽ trả lại một unicode mà không hề biết.
Còn Python 3 thì sao?
Python 3 không sử dụng __unicode__()
. Tuy nhiên, nếu bạn triển khai __str__()
để nó trả về unicode trong Python 2 hoặc Python 3, thì phần mã đó của bạn sẽ tương thích chéo.
Điều gì xảy ra nếu tôi muốn unicode(o)
khác biệt đáng kể str()
?
Thực hiện cả hai __str__()
(có thể trở lại str
) và __unicode__()
. Tôi tưởng tượng điều này sẽ hiếm, nhưng bạn có thể muốn đầu ra khác biệt đáng kể (ví dụ: phiên bản ASCII của các ký tự đặc biệt, như ":)"
cho u"☺"
).
Tôi nhận ra một số có thể tìm thấy điều này gây tranh cãi.