Pytanie Czy istnieją narzędzia, które mogą wykrywać błędy, takie jak ten?


W tym tygodniu znalazłem następujący błąd w moim kodzie:

import datetime

d = datetime.date(2010,9,24)
if d.isoweekday == 5:
    pass

Tak, zamiast tego powinien to być d.isoweekday ().

Wiem, że gdybym miał przypadek testowy, zostałbym uratowany. Porównanie funkcji z 5 nie jest zbyt użyteczne. Och, nie obwiniam o to Pythona.

Moje pytanie: czy istnieją narzędzia, które mogą wykrywać takie błędy jak ten?


16
2017-09-22 12:45


pochodzenie


"gdybym miał do tego przypadek testowy". Czy to nie jest odpowiedź na twoje pytanie? "Napisz test jednostkowy." - S.Lott
@ S.Lott przyłapałem się na tej odpowiedzi. Więc nie. :) - Eddy Pronk
Tęskniłeś za sednem. Biorąc pod uwagę (a) brak testu i (b) odpowiedzi, które masz, będziesz musiał zacząć pisać testy. - S.Lott
Gdybym tylko miał dość reputacji, by edytować to pytanie, mógłbym mieć możliwość naprawienia literówki. - Chris


Odpowiedzi:


Jako alternatywny, większość projektów Python jednostka testowana i przetestowany system. Jeśli masz oba (lub nawet tylko testy jednostkowe), znajdziesz swój problem wraz z prawie każdym innym problemem.

Tak jak dekomote powiedział, to jest składnie poprawne. Python jest nie statycznie wpisane, więc nie można tego uchwycić jako błędu. Co najwyżej może to być ostrzeżenie.

EDYCJA: Python jest silnie typowany, tylko typ jest sprawdzany w czasie wykonywania.


7
2017-09-22 12:34



-1 python jest silnie wpisany. Nie jest statycznie wpisane. To nie jest małe rozróżnienie. Co więcej, nie powinno to być ostrzeżeniem, ponieważ porównanie jest całkowicie poprawne. - aaronasterling
Dziękuję za poprawienie mnie. Cóż, nie zmienia się zbyt wiele, chyba że narzędzie jest w stanie emulować wykonanie bez uruchamiania programu. Inaczej może być tylko domysłem. - Wernight
+1 za to, że jako jedyny w odpowiedzi poleca testowanie jednostkowe (S. Lott jest na nim w komentarzach) - aaronasterling
To, że jest całkowicie poprawne, nie oznacza, że ​​nie jest warte ostrzeżenia. W C, if (x=false) jest również całkowicie poprawny, ale wszyscy cieszymy się, że kompilator ostrzega nas, gdy pojawi się w naszym kodzie. - Darryl
@Darryl: C jest statycznie wpisane. Nie oznacza to, że nie może istnieć ostrzeżenie, ale ostrzeżenie może być nieprawidłowe. - Wernight


Sprawdzić pylint może być w stanie to uzyskać. Znajduje wiele błędów.


3
2017-09-22 12:43



Nie znajdzie tego błędu. - dekomote
Ani nie Pychecker. - Annika Backstrom
To dlatego, że nie ma tu błędu. d.isoweekday == 5 to prawidłowe stwierdzenie. - dekomote
@dekomote To nie działało tak, jak zamierzał Eddy, więc jest to błąd użytkownika, który ma uchwycić linters. Nie, żeby mogli wszystko złapać, ale nie można powiedzieć, że nie było błędu. - Annika Backstrom
@Dogleote: brakuje ci punktu kontroli i pylinta. Nie służą do wyszukiwania nieprawidłowego Pythona: służą do znajdowania błędów popełnianych przez ludzi. Na przykład mogą ci powiedzieć, że importujesz moduł, ale nigdy go nie używasz, co jest doskonale poprawnym językiem Pythona, ale prawdopodobnie nie jest to, co chciałeś. - Ned Batchelder


Cóż, nie jest to błąd w python per se, ponieważ w Pythonie funkcje są wywoływalne obiekty. Możesz wykonać dowolny obiekt, który można wywołać poprzez implementację __call__. Tak więc d.isoweekday == 5 jest prawidłowym stwierdzeniem. To będzie Fałsz.

Jeśli chodzi o inne błędy, sugeruję sprawdzanie pyflakes - http://divmod.org/trac/wiki/DivmodPyflakes


3