Seite 1 von 1

globale variable vermeiden

Verfasst: Montag 18. Mai 2009, 20:05
von digted
Hallo, ich hab irgendwo mal gelesen, dass globale Variablen böse sind :) . Erstmal möchte ich fragen wieso? Eigentlich sind sie doch praktisch.

Nun hab ich hier eine kleine Passwortabfrage geschrieben.

Code: Alles auswählen

import datetime 
def passwort():
    
    i=3;    
    while (i>=1):
        username = raw_input('Username? ')
        pw = raw_input('Passwort? ')
        if (username == "admin" and pw == "1234"):
            print 'Passwort OK'
            i=0;
        else:
            versuche = i-1;
            if (versuche == 0):
                print "Ihr Konto wurde gesperrt"
                datei = file("E:\Proggen\erstes\src\daten\datei.txt","a") 
                benutzer_name = str(username)                       ## Kontosperre wird geloggt
                benutzer_info = str(benutzer_name) + " " +  str(datetime.datetime.now()) + "\n"
                datei.write(benutzer_info)                          ## String wird in Datei geschrieben
                datei.close()
            else:                    
                print 'Passwort Falsch oder Benutzernamefalsch' + "Sie haben noch " + str(versuche) + " Versuche";
        i=i-1;



passwort()

So, ich weiß nicht ob das Sinn hat, aber darum geht es mir nicht.

Code: Alles auswählen

 datei = file("E:\Proggen\erstes\src\daten\datei.txt","a") 
                benutzer_name = str(username)                       ## Kontosperre wird geloggt
                benutzer_info = str(benutzer_name) + " " +  str(datetime.datetime.now()) + "\n"
                datei.write(benutzer_info)                          ## String wird in Datei geschrieben
                datei.close()
Nun möchte ich, die Schreibfunktion für die Datei in eine eigene Funktion auslagern. Nun habe ich bis jetzt mit der lokalen Variable "username" gearbeitet. Ich könnte natürlich jetzt mit einer globalen Variable ganz einfach auf "username" zugreifen. Das möchte ich allerdings nicht. Gibt es eine Möglichkeit? Oder ist mein Vorhaben total sinnlos und macht die Sache unnötig kompliziert?

Ich brauch keine Komplettlösung, möchte gern noch ein bisschen denken ;)

Verfasst: Montag 18. Mai 2009, 20:11
von snafu
Wieso? Alles was "über" deiner Funktion steht, gilt auch innerhalb der Funktion. Du kannst also ohne weiteres auf `username` von der Funktion aus zugreifen. Falls du später damit weiterarbeiten willst, solltest du `username` aber auch zurückgeben (`return`).

Code: Alles auswählen

In [1]: foo = 'bar'

In [2]: def baz(): print foo
   ...: 

In [3]: baz()
bar

Verfasst: Montag 18. Mai 2009, 20:22
von cofi
Veränderbare globale Variablen sind böse, da so alles mögliche Schreibzugriff hat und dir so schwer zu findende Bugs einbringt, Sicherheitslöcher aufreisst etc., dazu kommt die Designkomponente: Wenn etwas so zusammengehört dass es Zugriff auf die gleichen Variablen braucht, ist meist eine Klasse empfehlenswert.

Speziell bei deinem Problem springt einem aber was anderes ins Gesicht. Wenn du schon von Funktionen redest, warum nutzt die nicht gleich Parameter?

Aber zum Code: Was du schreibst ist kein Python.
Wenn man in Python Strichpunkte braucht, dann macht man etwas falsch. (Es sei denn man golft)

Weil ich mal Lust hatte(ungetestet):

Code: Alles auswählen

import datetime
def query_password(user_db, logfile):
    MAX_TRIES = 3
    for try_ in reversed(xrange(MAX_TRIES)):
        username = raw_input(u"Benutzername? ")
        password = raw_input(u"Passwort? ")
        if username in user_db and password == user_db[user_name]:
            print u"Eintritt gewährt"
            break
        else:
            print u"Daten falsch! Noch {0} Versuche".format(try_)
    else:
        print u"Konto gesperrt!"
        with open(logfile) as log:
            log.write("{0}: {1}".format(username, datetime.datetime.now()))

Verfasst: Montag 18. Mai 2009, 20:27
von derdon
try würde ich aber nicht überschreiben.

Verfasst: Montag 18. Mai 2009, 20:31
von cofi
derdon hat geschrieben:try würde ich aber nicht überschreiben.
Psst .. das war doch der Test :) Außerdem kann das nicht überschrieben werden, da Statement.
Aber wenn du mich schon verrätst, besser ichs aus ;)