Open m-kowalewski opened 4 years ago
Tylko wtedy, w jaki sposób jesteśmy w stanie to sprawdzić, gdyby na przykład args był listą, której wszystkimi elementami są liczby Kiedy podasz listę z liczbami to de facto podajesz poprawny input dla funkcji i error nie zostanie rzucony Jeśli chcesz zobaczyć czy funkcja zwraca odpowiedni błąd od powinieneś podać jako input np listę zawierają nie liczby, powiedzmy stringi np: ['1', '2', '3']
Można może liczyć na podpowiedź w kwestii tego gdzie powinien zostać podniesiony wyjątek "OperationNotSupportedError"? Pozostałe dwa zaimplementowałem i podnoszę w odpowiednich metodach, ale nie jestem pewien gdzie powinienem szukać czynnika, który striggeruje ten error
Czy można prosić o bardziej precyzyjne wyjaśnienie sytuacji, w której wyjątek ma być rzucony?
Dodatkowo, mój program rzuca wyjątkiem gdy *args oznacza dla niego coś co nie jest intem. Nie rozumiem więc czemu nie przechodzi testów. Submituję pomimo błędów, jakbyście mogli w poniedziałek zerknąć byłbym wdzięczny
Podpinam się pod pytanie vvooycik: nie wiem, gdzie powinienem podnosić wyjątek OperationNotSupportedError, żeby przechodziło testy. Komunikat błędu podpowiada mi, że mam szukać w tym, jak rozszerzyłem implementację mnożenia. Ale prawdę mówiąc nie wiem już na co patrzeć.
_myfraction_raises_invalid_operanderror
Tast Failed cause InvalidOperandError was not thrown in valid way
More info
Traceback (most recent call last):
File "/home/runner/unit_tests.py", line 261, in test_myfraction_raises_invalid_operand_error
a = polynomianl * operand
File "/home/runner/unit_tests.py", line 143, in __mul__
raise OperationNotSupportedError
unit_tests.OperationNotSupportedError
Podpinam się pod vvooycik: Dodatkowo, mój program rzuca wyjątkiem gdy *args oznacza dla niego coś co nie jest intem. Nie rozumiem więc czemu nie przechodzi testów. Submituję pomimo błędów, jakbyście mogli w poniedziałek zerknąć byłbym wdzięczny.
Dokładnie to samo.
Odpowiadając na Wasze pytania:
for x in args: if not isinstance(x, (int, float)): raise ....
Ale czy dla wszystkich przypadków musi to działać ?
Powinno, niemniej jest haczyk
Sprawdźcie init dla wszystkich możliwości typów wbudowanych np: Int, Float, Bool, Dict, List, Tuple, Set .... itp.Przy Tym problemie pomogło mi zamienienie isinstance na type() File "/home/runner/unit_tests.py", line 242, in test_validate_input_raises_error MyPolynomial(*args) AssertionError: InvalidInputOperandError not raised Czy komuś również pojawiał się ten błąd?: Traceback (most recent call last): File "/home/runner/unit_tests.py", line 244, in test_myfraction_doesnt_work_with_double_operands c = 9 / b AssertionError: OperationNotSupportedError not raised
Nic tak dobitnie by mnie nie nauczyło i utwierdziło w tym, że bool
jest instancją int
-a, jak właśnie to zadanie :P Wszędzie zostałem z walidacją poprzez isinstance
, ale właśnie z uwzględnieniem tego pythonowego chochlika. (True + True) * 2 == 4 :D
@Targowsky Tak, pojawił ;) Czy na pewno masz zaimplementowane odwrócone dzielenie, __rtruediv__
?
Sprawdzam w inicie czy podane argumenty są typu: int,float, bool, dict, list, tuple, set i rzucam InvalidInputOperandError kiedy tak nie jest oraz sprawdzam czy wszystkie podane argumenty są tego samego typu, jeśli nie to też rzucam błędem. Jednakże, niestety wciąż nie przechodzi testów, gdzie może leżeć przyczyna?
Czym jest to args w testach? Bo nawet jeśli args jest tuplej to args przekaże do constructora jej elementy. I jak w init sprawdzić, że była przekazana tupla?
Traceback (most recent call last): File "/home/runner/unit_tests.py", line 284, in test_validate_input_raises_error MyPolynomial(*args) AssertionError: InvalidInputOperandError not raised
Nie wydaje mi się, żeby rtruediv było potrzebne w jakimkolwiek innym teście niż ten, który sprawdza, że przy jego wywołaniu masz rzucić wyjątkiem o niewspieranej operacji. W końcu dzielenie przecież nie jest naprzemienne, tak jak mnożenie jest. Więc nie rozumien czemu chcesz to implementować analogicznie do mnożenia.
Jeżeli używacie isinstance
to zauważcie, że:
x = False
isinstance(x, int)
daje rezultat
True
(Wiem, powtarzam się, ale ciągle jaram się tym, że to ogarniam xD).
@JacobJustCoding Zrób bardziej restrykcyjnego inita.
@AndrewMatviichuk Jak wyżej: zaimplementuj bardziej restrykcyjny init.
Do sprawdzania typów przyjmowanych danych poczytaj o metodach type()
i isinstance()
. Wybierz swoją ulubioną ;)
Cześć. Dość mocno zaciąłem się w punkcie: validate_input_raises_error: Traceback (most recent call last): File "/home/runner/unit_tests.py", line 242, in test_validate_input_raises_error MyPolynomial(args) AssertionError: InvalidInputOperandError not raised Czy jest możliwość uzyskać wskazówkę? Rozumiem że program powinien wchodzić w InvalidInputOperandError w momencie gdy będziemy wywoływali klasę MyPolynomial używając argumentu, który będzie poprzedzony przez "gwiazdka"? (tak jak pokazuje w błędzie - MyPolynomial(args)) Tylko wtedy, w jaki sposób jesteśmy w stanie to sprawdzić, gdyby na przykład args był listą, której wszystkimi elementami są liczby?