Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wykład 4 - Zadanie 3 #23

Open
m-kowalewski opened this issue Dec 6, 2019 · 12 comments
Open

Wykład 4 - Zadanie 3 #23

m-kowalewski opened this issue Dec 6, 2019 · 12 comments

Comments

@m-kowalewski
Copy link

m-kowalewski commented Dec 6, 2019

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?

@webster58
Copy link
Collaborator

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']

@vvooycik
Copy link

vvooycik commented Dec 7, 2019

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

@JJC-code
Copy link

JJC-code commented Dec 7, 2019

Czy można prosić o bardziej precyzyjne wyjaśnienie sytuacji, w której wyjątek ma być rzucony?

@vvooycik
Copy link

vvooycik commented Dec 7, 2019

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

@kMatejak
Copy link

kMatejak commented Dec 8, 2019

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_operand_error
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

@m-kowalewski
Copy link
Author

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.

@webster58
Copy link
Collaborator

Odpowiadając na Wasze pytania:

  1. InvalidInputOperandError, Sprawdźcie proszę wywołanie inita Waszej klasy na wszystkich przypadkach i sprawdźcie proszę co może być nie tak.
    rozumiem że w większości przypadków walidujecie wejście w pętli:
    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.
  2. OperationNotSupportedError
    Ten błąd powinien być rzucony kiedy operacja nie jest obsługiwana. Poza dodawaniem i innymi matematycznymi operacjami są też te nie matematyczne których Wasza klasa nie obsługuje. Jest lista w dokumentacji funkcji "magicznych" które powinniście obsłużyć, albo np na tym blogu:
    https://rszalski.github.io/magicmethods/

@Targowsky
Copy link

Targowsky commented Dec 9, 2019

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

@kMatejak
Copy link

kMatejak commented Dec 9, 2019

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__?

@JJC-code
Copy link

JJC-code commented Dec 9, 2019

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?

@andrii-matviichuk
Copy link

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

@kMatejak
Copy link

kMatejak commented Dec 9, 2019

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ą ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants