Tôi đã được hiểu rằng gọi số print obj
sẽ gọi obj.__str__()
để lần lượt trả về một chuỗi để in trên bảng điều khiển. Bây giờ tôi gặp vấn đề với Unicode, nơi tôi không thể in bất kỳ ký tự không phải ascii nào. Tôi nhận được công cụ "ascii ngoài phạm vi" điển hình.Sự khác biệt về Python giữa obj in và in obj .__ str __() [ít nhất với Unicode?]
Trong khi thực hiện thí điểm làm việc sau đây:
print obj.__str__()
print obj.__repr__()
Với cả hai chức năng làm giống hệt nhau (__str__()
chỉ trả self.__repr__()
). Những gì không hoạt động:
print obj
Sự cố chỉ xảy ra khi sử dụng ký tự trong phạm vi ascii. Giải pháp cuối cùng là để sau đây trong __str__()
:
return self.__repr__().encode(sys.stdout.encoding)
Bây giờ nó hoạt động cho tất cả các bộ phận. Câu hỏi của tôi bây giờ là: Sự khác biệt ở đâu? Tại sao nó hoạt động ngay bây giờ? Tôi nhận được nếu không có gì làm việc, tại sao điều này hoạt động ngay bây giờ. Nhưng tại sao chỉ phần trên cùng hoạt động, chứ không phải phần dưới cùng.
Hệ điều hành là Windows 7 x64 với dấu nhắc lệnh Windows mặc định. Mã hóa cũng được báo cáo là cp850
. Đây là một câu hỏi chung để hiểu python. Vấn đề của tôi đã được giải quyết, nhưng tôi không hạnh phúc 100%, chủ yếu là vì bây giờ gọi str(obj)
sẽ mang lại một chuỗi không được mã hóa theo cách tôi muốn.
# -*- coding: utf-8 -*-
class Sample(object):
def __init__(self):
self.name = u"üé"
def __repr__(self):
return self.name
def __str__(self):
return self.name
obj = Sample()
print obj.__str__(), obj.__repr__(), obj
Xóa cuối cùng obj
và hoạt động. Giữ nó và nó bị treo với
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
gì Python phiên bản là bạn đang chạy? –
Hiển thị ví dụ tối thiểu về lớp của obj với các mẫu của chuỗi bạn in. –
Bạn có thể tìm kiếm 'obj .__ unicode __()'? –