Dlaczego ktoś miałby kiedykolwiek wracać NotImplementedzamiast zgłaszać NotImplementedErrorwyjątek? Czy nie utrudni to tylko znalezienia błędów, takich jak kod, który wykonuje nieprawidłowe metody?
Jest tak, ponieważ __lt__()i powiązane metody porównywania są dość często stosowane pośrednio w sortowaniu list i tym podobne. Czasami algorytm wybiera inną metodę lub wybiera domyślnego zwycięzcę. Zgłoszenie wyjątku wyskoczyłoby z tego rodzaju, chyba że zostanie złapane, podczas NotImplementedgdy nie zostanie podniesione i może zostać użyte w dalszych testach.
" NotImplementedsygnalizuje środowisku wykonawczemu, że powinien poprosić kogoś innego o wykonanie operacji. W wyrażeniu a == b, jeśli a.__eq__(b)zwraca NotImplemented, to Python próbuje b.__eq__(a). Jeśli bwie wystarczająco dużo, aby powrócić Truelub False, wówczas wyrażenie może się powieść. Jeśli nie, środowisko wykonawcze powróć do wbudowanego zachowania (które opiera się na tożsamości dla ==i !=). ”
Kiedy interpreter Pythona sprawdza, czy a.__eq__(b)zwrócił NotImplemented, czy nie może równie łatwo złapać NotImplementedError (i wywołać, b.__eq__(a)czy cokolwiek innego)?
@Veky. Zgłaszanie wyjątku prawdopodobnie wiąże się z większym nakładem. Wszelkie koszty ogólne w operacji sortowania zostaną powiększone o rozmiar listy, więc nawet jeśli różnica byłaby bardzo mała, nadal byłoby sensowniejsze znalezienie szybszej implementacji. Nie chcesz także wyrwać się z pętli i ponownie je wprowadzić, co wymagałoby implementacji try / catch.
Po pierwsze, jeszcze szybszym rozwiązaniem byłoby automatyczne zsyntetyzowanie lt jako odwróconego gt, zamiast zawsze wywoływania czegoś, co zwróci NotImplemented - a Python tego nie robi. Nie sądzę, że powodem jest tutaj prędkość. Po drugie, nie rozumiem tego, co mówisz: return będzie wymagał tyle samo wyjścia z pętli, co przebicie. W rzeczywistości możesz sobie wyobrazić return jako podniesienie specjalnego wyjątku Return, który zawsze jest zatrzymywany w zakresie wywoływania.
powinny być zwracane przez metody specjalnych binarne (np __eq__(),
__lt__(),__add__() , __rsub__(), itd.), aby wskazać, że operacja nie jest realizowane w stosunku do innego rodzaju
[...] W klasach podstawowych zdefiniowanych przez użytkownika metody abstrakcyjne powinny zgłaszać ten wyjątek, gdy wymagają klas pochodnych w celu zastąpienia metody lub podczas opracowywania klasy w celu wskazania, że należy jeszcze dodać rzeczywistą implementację.
Jednym z powodów jest wydajność. W sytuacji takiej jak rozbudowane porównania, w których można wykonać wiele operacji w krótkim czasie, konfigurowanie i obsługa wielu wyjątków może zająć dużo więcej czasu niż zwykłe zwrócenie NotImplementedwartości.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.