Python có một singleton gọi là NotImplemented
.
Tại sao ai đó muốn trở lại NotImplemented
thay vì đưa ra NotImplementedError
ngoại lệ? Sẽ không làm cho việc tìm lỗi khó hơn, chẳng hạn như mã thực thi các phương thức không hợp lệ?
Python có một singleton gọi là NotImplemented
.
Tại sao ai đó muốn trở lại NotImplemented
thay vì đưa ra NotImplementedError
ngoại lệ? Sẽ không làm cho việc tìm lỗi khó hơn, chẳng hạn như mã thực thi các phương thức không hợp lệ?
Câu trả lời:
Đó là bởi vì __lt__()
và các phương pháp so sánh có liên quan thường được sử dụng gián tiếp trong các loại danh sách và như vậy. Đôi khi thuật toán sẽ chọn thử một cách khác hoặc chọn một người chiến thắng mặc định. Tăng một ngoại lệ sẽ thoát ra khỏi loại trừ khi bị bắt, trong khi NotImplemented
không được nêu ra và có thể được sử dụng trong các thử nghiệm tiếp theo.
http://jcalderone.livejournal.com/32837.html
Để tóm tắt liên kết đó:
"
NotImplemented
báo hiệu cho bộ thực thi rằng nó sẽ yêu cầu người khác thỏa mãn thao tác. Trong biểu thứca == b
, nếua.__eq__(b)
trả vềNotImplemented
, thì Python cố gắngb.__eq__(a)
. Nếub
biết đủ để trả vềTrue
hoặcFalse
, thì biểu thức có thể thành công. Nếu không, thì bộ thực thi sẽ quay trở lại hành vi tích hợp (dựa trên danh tính cho==
và!=
). "
a.__eq__(b)
trả về NotIm Hiện không, nó có thể dễ dàng bắt NotImcellenceedError không (và gọi b.__eq__(a)
hoặc bất cứ điều gì sau đó)?
Bởi vì họ có trường hợp sử dụng khác nhau.
Trích dẫn các tài liệu (Python 3.6):
nên được trả lại bằng các phương pháp đặc biệt nhị phân (ví dụ như
__eq__()
,__lt__()
,__add__()
,__rsub__()
, vv) để cho biết rằng các hoạt động không được thực hiện đối với các loại khác
[...] Trong các lớp cơ sở do người dùng định nghĩa, các phương thức trừu tượng sẽ đưa ra ngoại lệ này khi chúng yêu cầu các lớp dẫn xuất ghi đè phương thức hoặc trong khi lớp đang được phát triển để chỉ ra rằng việc triển khai thực sự vẫn cần được thêm vào.
Xem các liên kết để biết chi tiết.
Một lý do là hiệu suất. Trong một tình huống như so sánh phong phú, nơi bạn có thể thực hiện nhiều thao tác trong một thời gian ngắn, việc thiết lập và xử lý nhiều ngoại lệ có thể mất nhiều thời gian hơn là trả lại NotImplemented
giá trị.