Eingabe vorschreiben

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
doggy
User
Beiträge: 22
Registriert: Freitag 19. September 2014, 10:32

Vielen Dank für die zahlreichen Antworten und Tipps.

Für meine Zwecke benötige ich keinen Benutzer. Es wird in der Ladestation lediglich eine kleine Zahlentastatur geben. Daher reicht es zunächst allgemein abzufragen, ob der PIN vorhanden ist.

range(1,6) habe ich wegen der if Abfrage genutzt. Würde ich range(5) eingeben, würden die maximalen 5 Versuche nicht funktionieren.

Dennoch habe ich versucht das Programm nun etwas schöner zu gestalten. Ebenfalls habe ich nun eine Liste erstellt, welche die eingegebenen PINS beim ersten mal abspeichert und bei der zweiten Eingabe wieder löscht. Dies soll später die Kabine für den Benutzer reservieren, so dass dieser mit denselben PIN die Kabine auch wieder öffnen kann. Hier das Script in neu.

Code: Alles auswählen

from time import sleep

def is_pin_valid(pin):
    return len(pin) == 4 and pin.isdigit()

speicher = [0,0,0,0,0,0]
gefunden = 0
while True:

    for i in range(1,6):
        pin = input("Bitte geben sie Ihren Pin ein: ")          
        data = open("pin.txt").read()    
            
        if pin in data and is_pin_valid(pin):
            print("Der PIN war korrekt")

            for k in range(6):
                if speicher[k] == pin:
                    speicher[k] = 0
                    gefunden = True
                    print(speicher)
                    break

            

            for j in range(6):
                if speicher[j] == 0 and not gefunden:
                    speicher[j] = pin
                    print(speicher)
                    break

            gefunden = False
            sleep(0.5)
            break
            
        else:
            print(i)
            print("Dieser Pin ist nicht korrekt")
            if i > 4 :
                print("5 Fehlversuche!")
                sleep(0.5)
In meiner Shell läuft dieses Script perfekt. Sobald ich es aber in meinem Raspberry Pi in der Console verwende und den Pin eingeben habe, wird mir folgender Fehler ausgegeben:

Traceback (most recent call last):
File "Ladestation2.py", line 16, in <module>
if PIN in data and is_pin_valid(PIN):
TypeError: 'in <string>' requires string as left operand, not int


ps. Ich finde dafür, dass ich kein gelernter Programmierer oder sonstiges bin und erst vor 2 Wochen überhaupt angefangen habe zu Programmieren ist es auch nicht so schlecht :(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also abgesehen davon, dass das nicht einen Deut "schöner" aussieht, hast Du keinen der Kritikpunkte umgesetzt! Ehrlich, die geben wir, weil sie sinnvoll sind :!:

Wie genau soll diese PIN-Datei aussehen? Aktuell steht da einfach *eine* einzige PIN drin, oder wie? Alles andere würde Deine aktuelle Fassung nämlich gar nicht *korrekt* verarbeiten.

Was soll dieser ``speicher`` genau machen? Und wieso ist der Benutzer bezogen, wenn Du angeblich gar keine Benutzer brauchst? Das kapiert vermutlich keiner hier ;-)

Was genau sollen diese sonderbaren Schleifen in denen Du den Speicher durchgehst und komische Dinge damit tust? Ich kapiere denn Sinn dahinter nicht!

Die Initialisierungen mit anderen Typen als den später zugewiesenen verwirren auch mehr, als dass sie nützen! Und eine Mischung aus ``0`` und Strings ist... nuja, sonderbar! Ich vermute das könnte man mit ``None`` besser ausdrücken - oder ggf. einen besseren Datentypen finden o.ä. Aber bislang ist mit diese Liste ja auch höchst unklar.

Wenn das später Teil eines "Programms" werden soll, wieso steht dann da quasi alles auf Modulebene, sprich, wird *immer* ausgeführt? Du solltest Dich - wie iirc schon erwähnt - *dringend* noch (?) einmal mit Funktionen und deren Sinn auseinander setzen. Du schreibst hier feinsten Spaghetti-Code! Und das sollte man vermeiden, wenn man später die Übersicht behalten will :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
doggy
User
Beiträge: 22
Registriert: Freitag 19. September 2014, 10:32

Die PIN-Datei soll einfach von irgendwelchen ungeübten beschrieben und neu aufgespielt werden können. Die schreiben einfach

Name PIN

Also

Herbert Schuhmacher 2323 z.B.

Die for-Schleifen sollen eine Liste beschreiben. Ich habe überlegt, diese Liste später zum zuweisen einer Kabine zu nutzen.
Ich steuere mit meinem Raspberry PI eine Ladestation mit 6 Kabinen. Wenn nun einer seinen PIN eingeben hat, soll sich die nächste freie Kabine öffnen und der PIN in die Liste geschrieben werden. Später möchte ich im echten Programm, dann die jeweilige Zeile der Liste abfragen. Das soll dazu dienen, dass derselbe Benutzer bei erneuter eingabe seines PINs auch wieder seine Kabine und nicht irgendeine andere öffnet.

Das heißt die erste Zeile der Liste steht für die Kabine 1, die zweite für Kabine 2 und so weiter.
BlackJack

@doggy: Warum steht in der Datei überhaupt ein Name wenn doch nur die PIN zählt? Und Dir ist klar, dass jede PIN in der Datei die Wahrscheinlichkeit erhöht das ein unbefugter eine PIN richtig erraten kann, weil die nicht noch mal an einen Namen geknüpft ist, der zusammen mit der PIN überprüft wird. Das gilt dann auch für das öffnen von belegten Kabinen.

Für diese Belegt-Geschichte ist das lineare operieren auf einer Liste nicht wirklich schön. Man würde da eher eine Menge mit freien Kabinen(nummern) und ein Wörterbuch das PINs auf Kabinennummern abbildet verwenden. Und hier haben wir dann auch schon genug Zustand, das man mal über eine Klasse nachdenken könnte.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

doggy hat geschrieben: Name PIN

Also

Herbert Schuhmacher 2323 z.B.
Also wirklich *eine* PIN-Datei für das gesamte System? Wozu das dann? Ich kapiere da immer noch nicht den Sinn! Wenn das nur ein Benutzer bedienen kann, wozu dann überhaupt ein PIN?
doggy hat geschrieben: Die for-Schleifen sollen eine Liste beschreiben. Ich habe überlegt, diese Liste später zum zuweisen einer Kabine zu nutzen.
Aber wieso so kompliziert? Und wieso wird einmal der PIN reingeschrieben und *direkt* danach wieder entfernt?
doggy hat geschrieben: Das soll dazu dienen, dass derselbe Benutzer bei erneuter eingabe seines PINs auch wieder seine Kabine und nicht irgendeine andere öffnet.

Das heißt die erste Zeile der Liste steht für die Kabine 1, die zweite für Kabine 2 und so weiter.
Ich empfinde es zwar merkwürdig, dass dann PIN zu nennen, aber ok. Du suchst hier nun einfach ein Dictionary! Damit kannst Du das viel einfacher handhaben, da es die Abbildung "PIN → Kabine" *direkt* unterstützt und Du nicht implizit über einen Index eine Verbindung schaffen musst! Da brauchst Du nicht mehr iterieren, sondern kannst ganz einfach über die PIN direkt herausfinden, welche Kabine jemand hat. (Wie auch immer eine Kabine datentechnisch aussieht!)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten