• 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

VPS Starter Arubacloud
0 głosów
200 wizyt
pytanie zadane 21 marca 2019 w Python 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 2019 przez niezalogowany
wybrane 21 marca 2019 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 2019 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 2019 przez niezalogowany
Zaraz to u siebie odpalę
komentarz 21 marca 2019 przez niezalogowany
edycja 21 marca 2019
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 2019 przez niezalogowany
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 2019 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

+1 głos
1 odpowiedź 534 wizyt
pytanie zadane 21 lipca 2021 w Python przez Fut_techs Początkujący (420 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...