Passwortsystem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jonik
User
Beiträge: 1
Registriert: Samstag 10. März 2012, 19:22

Ich habe vor kurzem die Idee eines kleinen Passwortsystems gehabt, und dachte mir, heute fange ich mal damit an. Ich bin ziemlicher Anfänger, nehmt daher bitte ein wenig Rücksicht.

Programmiert habe ich in 2.7, und folgendes habe ich geschrieben:

Code: Alles auswählen

B1="Niklas"
pw="Haus"
pwtipp="Worin wohnt man normalerweise?"

def Einloggen():
    versuche=3
    Einloggen2()

def Einloggen2():
    print "Benutzername:"
    BE=input(".")
    if BE==B1: 
        print "Passwort:"
        pweingabe=input("")
        if pweingabe==pw:
            print "Zugang gewehrt!"
            Hauptmenu()
        else:
            print "Das Passwort war falsch."
            print "Tipp:",pwtipp,
            versuche=versuche-1
            Einloggen2()
            
    else:
        print "Dieser Benutzer existiert nicht."
        Einloggen2()
        
def Hauptmenu():
    print "Hauptmenü"
    
    
Einloggen()
Ich denke ihr versteht, was ich bezwecken will, oder? Beim Ausführen funktioniert es allerdings nur bis zur Eingabe des Benutzernamens. Warum?

lg
Jonik
MightyM
User
Beiträge: 11
Registriert: Samstag 10. März 2012, 19:06

Hallo Jonik,

benutze statt input() mal raw_input()

Gruss
MightyM
User
Beiträge: 11
Registriert: Samstag 10. März 2012, 19:06

Ach und der Teil wird so auch nicht funktionieren:

Code: Alles auswählen

else:
            print "Das Passwort war falsch."
            print "Tipp:",pwtipp,
            versuche=versuche-1
            Einloggen2()
wenn du den pwtipp in den string reinnehmen willst musst du es mit einem Platzhalter (%s) tun:

print "Tipp: %s" %pwtipp

Und das mit den versuchen wird so gar nicht klappen, das Programm hat ja keine Ahnung was es machen soll wenn versuche auf 0 ist also würde es einfach weiter subtrahieren. Bzw. hier würdest du sowieso eine Fehlermeldung bekommen, da er in dieser Funktion 'versuche' gar nicht kennt

Gruss
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo und Willkommen im Forum!

Hui... da ist leider viel zu verbessern an Deinem Code :-)

- als erstes: Achte auf PEP8. Das ist der offizielle Python-Style Guide. Funktionsnamen schreibt man danach klein. Bezeichner ebenso (``BE`` -> ``be``)

- Deine Namen sind schlecht gewählt. ``B1`` soll wohl "Benutzer nummer eins" sein, ``BE`` "Benutzereingabe"? Wieso nicht schlicht ``usser`` und ``user_input``? Du weisst nach einigen Wochen bestimmt nicht mehr, was sich hinter diesen Bezeichnern verbirgt. Das sinnvolle Benennen ist extrem wichtig und leider auch nicht wirklich einfach. Aber auch als Anfänger solltest Du darauf schon achten. Wenn Du einen Namen liest, solltest Du im Idealfall sofort erkennen, welches Art von Objekt sich dahinter verbrigt.

- Nummerieren sollte man Namen auch nicht; wenn man das tut, dann will man eigentlich eine Liste oder eine ähnliche Datenstruktur benutzen.

- Generell ist es eine schlechte Idee, zwei zusammenhängende Daten separat an zwei unterschiedliche Namen zu binden. Der Benutzer, sein Passwort und seine Frage bilden doch für jeden Benutzer eine "Einheit". Später würdest Du sicherlich eine Klasse ``User`` schreiben, aber zu Beginn kannst Du das mit einem Tupel, einer Liste oder einem Dictionary lösen; hier mal als Dictionary:

Code: Alles auswählen

user = {"name": "Hyperion", "password": "secret", "hint": "..."}
- Den Sinn hinter ``Einloggen1`` (auch kein guter Name!) sehe ich nicht.

- Du hast eine unbeabsichtigte Rekursion in Deinem Code! In ``Einloggen2`` rufst Du dieselbe Funktion innerhalb noch einmal auf. Das fällt bei wenigen Calls nicht auf, führt aber später zu einem Absturz.

- Deine Verwendung von ``print`` als Statement legt nahe, dass Du Python in Version 2.x verwendest. Dann solltest Du aber nicht ``input``, sondern ``raw_input`` verwenden.

- ``versuche`` wird in ``Einloggen2`` einen ``NameError`` auslösen, da das Binden in ``Einloggen1`` passiert und Namensräume in Python nicht über mehrere Funktionen hinaus gültig sind. Du musst die Anzahl an Login-Versuchen schon in dieser Funktion an einen Namen binden, oder etwa per Parameter übergeben.

- Du solltest Code auf Modulebene vermeiden:

Code: Alles auswählen

B1="Niklas"
pw="Haus"
pwtipp="Worin wohnt man normalerweise?"

# und unten
Einloggen()
Stattdessen verwende diesen Trick:

Code: Alles auswählen

def main():
    # hier setze Deine Parameter
    # rufe Deine Einstiegsfunktion auf

if __name__ == "__main__":
    main()
Ansonsten solltest Du Dir auf jeden Fall neben den grundlegenden Datentypen (s.o.) auch Funktionen genauer angucken. Dabei solltest Du Dich über Paraneter und Rückgabewerte schlau lesen. Deine Abfragen kann man nämlich in eine allgemeine Funktion auslagern und das Testen so vom Codeumfang reduzieren und leserlicher machen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

MightyM hat geschrieben:Ach und der Teil wird so auch nicht funktionieren:

Code: Alles auswählen

else:
            print "Das Passwort war falsch."
            print "Tipp:",pwtipp,
            versuche=versuche-1
            Einloggen2()
wenn du den pwtipp in den string reinnehmen willst musst du es mit einem Platzhalter (%s) tun:

print "Tipp: %s" %pwtipp
Schon mal ausprobiert? Weil das würde funktionieren. Ist sicher nicht die beste Lösung, aber das ist auch %s nicht. Da würde man das neue String-Formatting mit ``print "Tipp: {}".format(pwtipp)`` nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten