2009-05-18 9 views

Odpowiedz

184

To dlatego, że __lt__() i pokrewne metody porównywania są dość powszechnie używane pośrednio w sortowaniu list i tym podobnych. Czasami algorytm wybierze próbę w inny sposób lub wybranie domyślnego zwycięzcy. Podniesienie wyjątku wyłamałoby się z niego, chyba że zostanie złapane, podczas gdy NotImplemented nie zostanie podniesione i może być użyte w dalszych testach.

http://jcalderone.livejournal.com/32837.html

Podsumowując ten link:.

"NotImplemented sygnały do ​​wykonywania że powinien poprosić kogoś innego, aby zaspokoić operację W wyrażeniu a == b, jeśli a.__eq__(b) zwroty NotImplemented, następnie próbuje Pythona b.__eq__(a).Jeśli b wie wystarczająco, aby zwrócić True lub False, wyrażenie może się powieść, a jeśli nie, to środowisko wykonawcze powróci do zachowania wbudowanego (które jest oparte na identyfikatorze dla == i !=). "

+4

Byłbym ostrożny, używając tego, ponieważ to łącze wskazuje na końcu dokumentu. –

+8

Gdy interpreter Pythona sprawdza, czy 'a .__ eq __ (b)' zwróciło NotImplemented, czy nie mógłby tak łatwo złapać NotImplementedError zamiast (i wywołać 'b .__ eq __ (a)' lub cokolwiek innego)? – Veky

+11

@Veky. Podniesienie wyjątku prawdopodobnie ma większy narzut. Każdy narzut w operacji sortowania zostanie powiększony o wielkość listy, więc nawet jeśli różnica byłaby bardzo mała, sensowne byłoby znalezienie szybszej implementacji. Nie chcesz też rezygnować z pętli i wprowadzać ich ponownie, czego wymagałoby wdrożenie try/catch. – SpliFF

9

Jednym z powodów jest wydajność. W sytuacji, w której można przeprowadzić wiele porównań, w których można wykonać wiele operacji w krótkim czasie, skonfigurowanie i obsługa wielu wyjątków może zająć znacznie więcej czasu niż po prostu zwrócić wartość NotImplemented.

-4

Są funkcje, które podnoszą Wyjątki i funkcje, które nie, mogą być dla tego ostatniego ... naprawdę zależy to od programisty/projektu. Dlatego są tam zarówno do użytku.

+14

Proszę przejrzeć Zen z Python (">>> zaimportuj to"). Zwróć szczególną uwagę na wiersz 13: "Powinien istnieć jeden - a najlepiej tylko jeden - w oczywisty sposób to zrobić." Python to nie Ruby, Perl czy jakikolwiek inny język, w którym istnieją dziesiątki równie ważnych sposobów robienia czegoś. Odpowiedź nigdy nie jest taka, że ​​zależy to od gustu programisty. – ArtOfWarfare

18

Ponieważ mają różne przypadki użycia.

Cytowanie Dokumenty (Python 3.6):

NotImplemented

powinny być zwracane przez binarne metod specjalne (np __eq__(), __lt__(), __add__(), __rsub__(), itd.), Aby wskazać operacja nie jest implementowana w odniesieniu do innego typu:

exception NotImplementedError

[...] W zdefiniowanych przez użytkownika baza klas abstrakcyjnych metod należy podnieść ten wyjątek, gdy wymagają pochodzi klas przesłonić metodę, lub gdy klasa jest opracowywane w celu wskazania że rzeczywiste wdrożenie nadal wymaga dodania .

Zobacz linki dla szczegółów.

Powiązane problemy