• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak dobrze zdefiniować listę, by nie rzucało wyjątkami

0 głosów
90 wizyt
pytanie zadane 21 marca w Python, Django przez Patrycja Ły Początkujący (270 p.)

Hej,

w moim programie użytkownik ma podać wartość, jeśli nie będzie w liście z funkcji sprawdz_kolor, to ma wyrzucić wyjatek. Jednak w moim kodzie, nawet jak wpisuję wartość z listy to wyrzuca ten błąd. Co jest nie tak??

class BadCharException(ValueError):
    def __init__(self):
        super().__init__("Niepoprawna wartosc")


class EmptyStringException(ValueError):
    def __init__(self):
        super().__init__("Pusta wartosc")

def sprawdz_kolor(x):
    lista = ["zielony", "czerwony", "zolty", "niebieski", "czarny"]
    for kolor in x:
        if kolor not in lista:
            raise BadCharException
    if x == "":
        raise EmptyStringException

def main():
    try:
        podaj_kolor = input("Podaj kolor zamawianego kubka")
        podaj_kolor = podaj_kolor.lower()
        sprawdz_kolor(podaj_kolor)
    except BadCharException:
        print("Niepoprawny kolor. Wprowadź: zielony, czerwony, zolty, niebieski, czarny.")
    except EmptyStringException:
        print("Pole nie może byc puste.")

if __name__ == "__main__":
    main()

 

1 odpowiedź

0 głosów
odpowiedź 21 marca przez ZlapZabijIZakop Nałogowiec (32,520 p.)
wybrane 21 marca przez Patrycja Ły
 
Najlepsza

Panie, coś Ty tam Pan naklepał... Funkcja sprawdz_kolor przyjmuje wartość "x", w main widzę, że jest to pojedyncza wartość string, więc Twoja pętla

for kolor in x:

Nie robi nic innego, jak bierze każdy pojedynczy znak ze stringa, który wprowadziłeś jako parametr. Innymi słowy, user wpisuje "czarny", a Ty zamiast sprawdzić, czy w tablicy znajduje się czarny, to sprawdzasz, czy w tablicy znajdują się kolejno 'c', 'z', 'a', 'r', 'n', oraz 'y'. Ta pętla w ogóle tam jest niepotrzebna, żeby sprawdzić, czy jakaś wartość znajduje się w tablicy wystarczy prosty if-statement

if some_value in some_list:
    do_something()

czy też bardziej adekwatnie do Twojego przypadku:

if some_value not in some_list:
    do_something()

Debugowałeś to w ogóle? Printuj sobie chociaż wartości zmiennych, które wykorzystujesz, bo błędy nie biorą się znikąd, a jeśli jakiś się bierze, to i tak nikt Ci z nim nie pomoże...

komentarz 21 marca przez Patrycja Ły Początkujący (270 p.)

Wywaliłam tego fora i zostawiłam to:

if x not in lista:
    raise BadCharException

lecz mi dalej nie działa.

Nawet jak wpiszę wartość z listy, pojawia się komunikat z wyjątku

 

komentarz 21 marca przez ZlapZabijIZakop Nałogowiec (32,520 p.)
Zaraz to u siebie odpalę
komentarz 21 marca przez ZlapZabijIZakop Nałogowiec (32,520 p.)
edycja 21 marca przez ZlapZabijIZakop
No to zaskoczę Cię i powiem, że po usunięciu fora i wstawieniu tego ifa, U MNIE DZIAŁA. Domyślam się, gdzie może leżeć błąd więc podpowiem tylko, że biały znak, to też znak
(czyli " zielony" != "zielony") ;)
komentarz 21 marca przez ZlapZabijIZakop Nałogowiec (32,520 p.)
Ach, i dodam jeszcze, że postawienie ifa sprawdzającego, że wartość jest pusta dopiero ZA ifem sprawdzającym, czy wartość znajduje się (bądź nie) w liście, nie ma najmniejszego sensu.
komentarz 21 marca przez Patrycja Ły Początkujący (270 p.)
Dziękuję za odpowiedz. U mnie chyba będzie jeszcze o coś innego chodzić, bo to tylko fragment większego kodu.

Będę szukać przyczyny.

Podobne pytania

0 głosów
3 odpowiedzi 144 wizyt
pytanie zadane 11 września 2018 w Python, Django przez Deriquest Użytkownik (520 p.)
0 głosów
0 odpowiedzi 37 wizyt
Porady nie od parady
Zadając pytanie postaraj się o poprawną pisownię i czytelne formatowanie tekstu.Kompozycja

64,840 zapytań

111,302 odpowiedzi

234,095 komentarzy

46,709 pasjonatów

Przeglądających: 233
Pasjonatów: 6 Gości: 227

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...