globale variable vermeiden

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
digted
User
Beiträge: 7
Registriert: Mittwoch 26. November 2008, 18:29

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 ;)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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()))
Zuletzt geändert von cofi am Montag 18. Mai 2009, 20:32, insgesamt 1-mal geändert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

try würde ich aber nicht überschreiben.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
Antworten