Tại sao trả lại NotIm Hiệned thay vì tăng NotImcellenceedError


282

Python có một singleton gọi là NotImplemented.

Tại sao ai đó muốn trở lại NotImplementedthay vì đưa ra NotImplementedErrorngoạ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:


281

Đó 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 NotImplementedkhô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 đó:

" NotImplementedbá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ức a == b, nếu a.__eq__(b)trả về NotImplemented, thì Python cố gắng b.__eq__(a). Nếu bbiết đủ để trả về Truehoặc False, 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 ==!=). "


5
Tôi sẽ cẩn thận khi sử dụng nó, vì liên kết này chỉ ra gần cuối tài liệu.
Jason Coon

16
Khi trình thông dịch Python kiểm tra xem có 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 đó)?
Veky

24
@Veky. Tăng một ngoại lệ có thể có một chi phí cao hơn. Bất kỳ chi phí nào trong một hoạt động sắp xếp sẽ được phóng to theo kích thước của danh sách, vì vậy ngay cả khi chênh lệch rất nhỏ, vẫn sẽ có ý nghĩa để tìm cách triển khai nhanh hơn. Bạn cũng không muốn thoát ra khỏi các vòng lặp của mình và nhập lại chúng mà việc triển khai thử / bắt sẽ yêu cầu.
SpliFF

3
Đối với điểm đầu tiên, giải pháp thậm chí nhanh hơn sẽ là tự động tổng hợp lt dưới dạng gt đảo ngược, thay vì luôn luôn gọi một cái gì đó sẽ trả về Không thực hiện - và Python không làm điều đó. Tôi không nghĩ tốc độ là lý do ở đây. Và lần thứ hai, tôi không hiểu những gì bạn đang nói: sự trở lại sẽ đòi hỏi nhiều như việc thoát ra khỏi các vòng lặp như tăng lương. Trong thực tế, bạn có thể tưởng tượng sự trở lại khi đưa ra một ngoại lệ Trả lại đặc biệt, luôn bị bắt trong phạm vi gọi.
Veky

2
>> "được phóng to theo kích thước của danh sách" Ít nhất, trừ khi bạn có sắp xếp O (n) mà thế giới nên biết.
Jonathan Hartley

106

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):

Không được thực hiện

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

ngoại lệ NotIm HiệnedError

[...] 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.


13

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 NotImplementedgiá trị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.