Lubię podnosić NotImplementedError
metodę, którą chcę wdrożyć, ale tam, gdzie jeszcze się nie udało. Mogę już mieć częściową implementację, ale dodaj ją, raise NotImplementedError()
ponieważ jeszcze jej nie lubię. Z drugiej strony lubię też przestrzegać konwencji, ponieważ ułatwi to innym osobom utrzymanie mojego kodu, a konwencje mogą istnieć z dobrych powodów.
Jednak dokumentacja Python dla NotImplementedError stwierdza:
Ten wyjątek pochodzi od RuntimeError. W klasach podstawowych zdefiniowanych przez użytkownika metody abstrakcyjne powinny zgłaszać ten wyjątek, gdy wymagają klas pochodnych w celu zastąpienia metody.
Jest to o wiele bardziej konkretny, formalny przypadek użycia niż ten, który opisuję. Czy to dobry, konwencjonalny styl, aby podnieść NotImplementedError
po prostu, aby wskazać, że ta część interfejsu API jest w toku? Jeśli nie, to czy istnieje inny znormalizowany sposób na wskazanie tego?
Odpowiedzi:
Warto zauważyć, że chociaż dokumentacja Pythona zawiera przypadek użycia (i prawdopodobnie kanoniczny) dla tego wyjątku, nie wyklucza on wyraźnie jego zastosowania w innych scenariuszach.
Uznałbym za stosowne zgłoszenie wyjątku NotImplementedError, jeśli nie przesłano jeszcze metody w klasie bazowej (aby spełnić „interfejs”).
Pobieżna kontrola w Google sugeruje, że ludzie zrozumieją, co masz na myśli, jeśli zastosujesz wyjątek w ten sposób. Nie znam żadnych skutków ubocznych ani niezamierzonych konsekwencji; metoda po prostu wyrzuci wyjątek, jeśli zostanie wywołany, i wyrzuci wyjątek, który jest dobrze zrozumiały dla wszystkich.
Dokumentacji dla Pythona 3 odzwierciedla dokładnie ten wykorzystania:
źródło
Będzie to zrozumiałe, niezależnie od tego, czy to zrobisz, czy nie, powinno to zależeć od lokalnych konwencji (zespołu lub firmy). Zauważ, że ma to mniej sensu w kontekście TDD, ponieważ TEST powinien określać, że metoda nie jest zaimplementowana.
Krótka wersja to: użyj, jeśli Ty i Twój zespół uznacie to za właściwe.
źródło
Wygląda na
NotImplementedError
to, że zwykle jest podnoszony dla samego rozwoju funkcji Pythona, jak poniżej:Dokumentacja
Źródło
Collections.Counter.fromkeys
źródło