Warunek 'or' działanie

0

Witam
Napisałem logowanie. Użyłem warunku or. Niestety nie mogę zrozumieć jego działania.
Jeżeli użyję następującej składni cały program działa poprawnie.

if  zapytanie == None or zapytanie[0] == "":

natomiast jeżeli użyję składni poniżej

if zapytanie[0] == "" or zapytanie == None:

dostaję taki błąd:

 if  zapytanie[0] =="" or zapytanie == None:
TypeError: 'NoneType' object is not subscriptable

Z tego co mnie nauczono warunki przy użyciu or są zamienne. Nie mogę tego zrozumieć jedno działa a drugie nie.

1

nie wiem co rozumiesz przez "są zamienne". Zazwyczaj pierwszy wykonuje się warunek po lewej stronie, jak jest w pythonie to ci nie powiem, ale jeśli tak jest no to conajmniej musisz zamienić kolejność, bo najpierw masz sprawdzenie pierwszego elementy tablicy a potem sprawdzasz czy ten obiekt który wcześniej musiał być tablica, ma typ none. Kompletnie nielogiczny warunek.

4

Warunki są sprawdzane kolejno od lewej. W przypadku alternatywy wystarczy, że pierwszy warunek jest prawdziwy - sprawdzanie reszty jest pomijane.

W pierwszym przypadku najpierw następuje sprawdzenie, czy zapytanie nie jest None (czyli czy jest tam cokolwiek) i jeśli tak, to robione jest odwołanie do zerowego indeksu. Jeśli zapytanie rzeczywiście jest None, sprawdzanie prawdziwości warunku zakończy się na pierwszym członie i drugi nie zostanie sprawdzony.

W drugim natychmiast odwołujesz się przez indeks do zawartości zapytanie - w tym przypadku jeśli rzeczywiście jest to None, wysypie się z błędem takim, jaki wrzuciłeś.

0

@superdurszlak właśnie tak to rozumuję. W tym co napisałem najpierw jest sprawdzany od lewej pierwszy warunek jeśli jest prawdziwy nie jest sprawdzany drugi tylko pętla if jest wykonywana. Natomiast jeśli pierwszy warunek nie jest spełniony sprawdzany jest drugi i jeśli jest spełniony wchodzi do if. Jeśli żadne nie są spełnione if jest pomijany. I dlatego pytam dlaczego ten if działa:

if  zapytanie == None or zapytanie[0] == "":

natomiast ten nie działa:

if zapytanie[0] == "" or zapytanie == None:

Mówiąc o zamienności warunków w przypadku or chodzi mi o to że pierwszy jest warunek None czy sprawdzanie pustej tablicy jest wszytko jedno.

Generalnie jest to kawałek kodu sprawdzania użytkownika w logowaniu.
kod:

if  zapytanie == None or zapytanie[0]=="":
            print("jesteś jednak")
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setText("Błąd logowania")
            msg.setInformativeText('Podałeś błędny login <br> Spróbuj jeszcze raz')
            msg.setWindowTitle("Błąd")
            msg.exec()
        else:
            if zapytanie[1]== self.password_line.text():
                self.dialog = main.main_window()
                self.dialog.show()
                self.close()
            else:
                msg = QMessageBox()
                msg.setIcon(QMessageBox.Critical)
                msg.setText("Błąd logowania")
                msg.setInformativeText('Podałeś błedne hasło <br> Spróbuj jeszcze raz')
                msg.setWindowTitle("Błąd")
                msg.exec()

Mój tok myślenia jest taki. Użytkownik wpisuje prawidłowo login i hasło. Baza zwraca mi tego użytkowniczka oraz hasło. Hasło jest sprawdzane te wpisane z tym co wyrzuciła baza jeśli jest poprawne wchodzimy do programu. Jeśli hasło jest złe wypisywany jest komunikat. Natomiast jeśli Login jest źle wpisany baza danych zwraca mi None natomiast jeśli użytkownik nie wpisze loginu baza zwróci mi ('', '').

Dlatego moim zaskoczeniem jest to że jeżeli "zamienię" te dwa warunki wejścia do pętli if miejscami dostaje taki błąd:

if  zapytanie[0] =="" or zapytanie == None:
TypeError: 'NoneType' object is not subscriptable

Nie wiem dlaczego się tak dzieje. Kolejność warunków w przypadku or nie powinna mieć znaczenia. Chyba że ja mam jakieś braki wiedzy, lub coś źle rozumuję lub mam gdzieś błąd w kodzie i powielam go nieświadomie. Dodam że jeżeli ustawienie warunków if jest "prawidłowe" program zachowuje się prawidłowo i nie wysypuje żadnych błędów. Dlatego chciałbym się dowiedzieć dlaczego "odwrotne" ustawienie warunków if powoduje błędy jak i tak podczas działania programu sprawdzany jest albo jeden warunek albo drugi. Tego nie mogę zrozumieć.

2

No ten drugi wariant wysypuje się dlatego, że dochodzi do sprawdzenia warunku zapytanie[0] == "", zanim dojdzie do sprawdzenia, czy tam przypadkiem nie siedzi None. W ciemno sięgasz wtedy po element pod indeksem 0 bez sprawdzenia, czy jest w ogóle do czego sięgać. A ponieważ nie ma do czego (bo jest tam None), interpreter słusznie krzyczy, że odwołujesz się do indeksu obiektu NoneType, który to żadnych elementów nie posiada.

To tak, jakbyś miał dwie sytuacje w sklepie:

Pierwsza:

  • dzień dobry, mają Państwo wędliny?
  • nie proszę Pana, tu jest warzywniak, a w ogóle to dziś jest święto i nie sprzedajemy
  • dziękuję, do widzenia

Druga, ten sam sklep:

  • dzień dobry, proszę mi odkroić tak ze 30dag tej kiełbasy swojskiej, trzeciej od lewej
  • ???
0

Błędnie myślisz, popatrz na to, że ten kod wykonuje się liniowo. On nie wykonuje obu warunków, bo nie ma prawa, nie strzela który ma wykonać, wykonuje je zawsze po kolei. Jesli pierwszy zwraca 0 to bada drugi, jeśli pierwszy zwraca 1 to nie bada drugiego.

0

Ok dzięki przebuduję to logowanie w taki sposób by sprawdzanie było najpierw zanim dojdzie do sprawdzenia w bazie danych czy użytkownik coś wpisał czy nie.
Dziękuję za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1