Có quy ước python khi nào bạn nên triển khai __str__()
so với __unicode__()
. Tôi đã thấy các lớp ghi đè lên số __unicode__()
thường xuyên hơn __str__()
nhưng dường như không nhất quán. Có quy tắc cụ thể nào khi thực hiện tốt hơn một quy tắc so với quy tắc khác không? Có cần thiết/thực hành tốt để thực hiện cả hai?Python __str__ so với __unicode__
Trả lời
__str__()
là phương pháp cũ - nó trả về byte. __unicode__()
là phương thức ưa thích mới - nó trả về các ký tự. Các tên có một chút khó hiểu, nhưng trong 2.x chúng tôi đang mắc kẹt với chúng vì lý do tương thích. Nói chung, bạn nên đặt tất cả các chuỗi của bạn định dạng trong __unicode__()
, và tạo ra một cuống __str__()
phương pháp:
def __str__(self):
return unicode(self).encode('utf-8')
Trong 3.0, str
chứa các ký tự, vì vậy các phương pháp tương tự được đặt tên __bytes__()
và __str__()
. Những hành vi như mong đợi.
Với thế giới ngày càng nhỏ hơn, rất có thể là bất kỳ chuỗi nào bạn gặp sẽ chứa Unicode cuối cùng. Vì vậy, đối với bất kỳ ứng dụng mới nào, bạn nên cung cấp ít nhất __unicode__()
. Cho dù bạn cũng ghi đè __str__()
thì chỉ là vấn đề về hương vị.
Nếu tôi không đặc biệt quan tâm đến việc tối ưu hóa vi mô hóa cho một lớp nhất định, tôi luôn thực hiện __unicode__
chỉ vì nó tổng quát hơn. Khi tôi quan tâm đến các vấn đề về hiệu suất phút đó (ngoại lệ, không phải quy tắc), chỉ có __str__
(khi tôi có thể chứng minh sẽ không bao giờ có các ký tự không phải ASCII trong đầu ra được xâu chuỗi) hoặc cả hai (khi cả hai đều có thể), có thể giúp. Tôi nghĩ rằng đó là những nguyên tắc vững chắc, nhưng trong thực tế nó rất phổ biến để BIẾT sẽ không có gì ngoài các ký tự ASCII mà không cần nỗ lực để chứng minh nó (ví dụ: dạng được xâu chuỗi chỉ có chữ số, dấu chấm câu, và có thể là tên ASCII ngắn; -) trong trường hợp nó khá điển hình để chuyển trực tiếp sang phương pháp "chỉ __str__
" (nhưng nếu một nhóm lập trình tôi đã làm việc với đề xuất một hướng dẫn địa phương để tránh điều đó, tôi sẽ +1 trên đề xuất, vì nó dễ dàng err trong những vấn đề này và "tối ưu hóa sớm là gốc rễ của tất cả các điều ác trong lập trình" ;-).
Trong python 2.6.2, tôi gần đây đã vấp lên vì trường của một lớp con Ngoại lệ tích hợp đặc biệt cho các kết quả khác nhau với str (e) và unicode (e). str (e) cho đầu ra thân thiện với người dùng; unicode (e) cho đầu ra khác nhau, không thân thiện với người dùng. Đây có phải là hành vi bị lỗi không? Lớp học là UnicodeDecodeError; Tôi đã không đặt tên nó lên phía trước để tránh nhầm lẫn - thực tế là ngoại lệ liên quan đến unicode không liên quan đặc biệt. –
Nếu bạn đang làm việc trong cả hai python2 và python3 trong Django, tôi khuyên bạn nên trang trí python_2_unicode_compatible:
Django cung cấp một cách đơn giản để xác định str() và unicode() phương pháp mà làm việc trên Python 2 và 3: bạn phải xác định phương thức trả về str() và áp dụng trang trí python_2_unicode_compatible().
Như đã lưu ý trong các nhận xét trước đó cho một câu trả lời khác, một số phiên bản của future.utils cũng hỗ trợ trình trang trí này. Trên hệ thống của tôi, tôi cần cài đặt một mô-đun tương lai mới hơn cho python2 và cài đặt tương lai cho python3. Sau đó, thì đây là một ví dụ chức năng:
#! /usr/bin/env python
from future.utils import python_2_unicode_compatible
from sys import version_info
@python_2_unicode_compatible
class SomeClass():
def __str__(self):
return "Called __str__"
if __name__ == "__main__":
some_inst = SomeClass()
print(some_inst)
if (version_info > (3,0)):
print("Python 3 does not support unicode()")
else:
print(unicode(some_inst))
Dưới đây là đầu ra ví dụ (nơi venv2/venv3 những trường virtualenv):
~/tmp$ ./venv3/bin/python3 demo_python_2_unicode_compatible.py
Called __str__
Python 3 does not support unicode()
~/tmp$ ./venv2/bin/python2 demo_python_2_unicode_compatible.py
Called __str__
Called __str__
- 1. Tại sao __unicode__ không hoạt động nhưng __str__ làm gì?
- 2. In bằng Python không sử dụng __repr__, __unicode__ hoặc __str__ cho lớp con unicode?
- 3. Ký tự định dạng chuỗi Python cho __unicode__?
- 4. Python: Cách ép "in" để sử dụng __unicode__ thay vì __str__, hoặc nếu không tự nhiên "in" tin nhắn mà không gọi một cách rõ ràng unicode()
- 5. Django: Nhiều pythonic __unicode__
- 6. in trăn vs __str__?
- 7. Python: __str__, nhưng đối với một lớp học, không phải là một ví dụ?
- 8. Python của join() sẽ không tham gia chuỗi đại diện (__str__) của đối tượng của tôi
- 9. Python nếu so với try-except
- 10. chuỗi byte so với chuỗi unicode. Python
- 11. Haskell so với mô hình luồng Python
- 12. Boo vs C# so với Python?
- 13. Ruby on Rails so với Python
- 14. Python 2 so với Python 3 - định dạng urllib
- 15. Python (và Python C API): __new__ so với __init__
- 16. Mục đích của __str__ và __repr__ là gì?
- 17. pymssql so với pyodbc so với adodbapi so với ...
- 18. Sử dụng biểu diễn __str__ cho các đối tượng in trong các thùng chứa trong Python
- 19. Quy ước Python ** kwargs so với ** kwds so với ** kw là gì?
- 20. Tôi có thể sử dụng ForeignKey trong __unicode__ không?
- 21. Sử dụng phương pháp khác ngoài __unicode__ trong ModelChoiceField Django
- 22. Python md5 băm so
- 23. APL so với A so với J so với K?
- 24. Điểm mạnh của Shell Scripting so với Python
- 25. Thuật ngữ: Python và Numpy - `iterable` so với` array_like`
- 26. Sử dụng eval của python() so với ast.literal_eval()?
- 27. Dấu chân python so với thời gian chạy java
- 28. Biến cá thể so với biến lớp trong Python
- 29. Nhập mô-đun Python: Một dòng so với Đa dòng
- 30. Theo dõi đối tượng: MATLAB so với Python Numpy
bạn có nghĩa là tạo cả hai phương thức __unicode__ và __str__ hoặc chỉ giữ chuỗi trong _ (u "") và tạo __string__ (không có phương thức unicode)? – muntu
Có lỗ hổng nào trong việc triển khai chỉ một trong số đó không? Điều gì xảy ra khi bạn chỉ thực hiện '__unicode__' và sau đó làm' str (obj) '? – RickyA
'unicode' tăng một' NameError' trên Python 3, là một mẫu đơn giản hoạt động trên cả 2 và 3? –