Seite 1 von 1

globale variable in funktion verändern ?

Verfasst: Donnerstag 8. Juni 2006, 07:53
von stigi
ich habe 3 globale variablen

Code: Alles auswählen

c_error = 0
c_autoedit = 0
c_manuedit = 0
nun möchte ich innerhalb meiner funktion diese counter hochzählen - geht das überhaupt ?

Code: Alles auswählen

def runthrough():
    def autocorrect():
        c_autoedit = c_autoedit + 1
    def nocorrect():
        c_error = c_error + 1
    def manucorrect():
        c_manuedit = c_manuedit + 1
also so gehts ja sicher nicht denk ich mal war nur zum veranschaulichen was ich meine

Verfasst: Donnerstag 8. Juni 2006, 08:41
von Michael Schneider
Hallo Stigi,

sicher geht das, aber nicht mit Integer-Variablen, da diese in Funktionen im lokalen Namensbereich neu angelegt werden. Du müsstest sie also entweder über z.B. "global c_error" in der Funktion bekanntmachen, damit in die globale Variable geschrieben wird, oder Du verpackst sie in Objekte, auf die automatisch im globalen Namensbereich zugegriffen wird. Auch da gibt es viele Möglichkeiten:

Ein Dictionary:

Code: Alles auswählen

glob = {"error" : 0,
        "autoedit" : 0,
        "manuedit" : 0}

def autocorrect(): glob["autoedit"] += 1
def nocorrect(): glob["error"] += 1
def manucorrect(): glob["manuedit"] += 1

##  test
nocorrect()
print glob
reicht für die angegebenen Anforderungen aus. Wenn Du es etwas komfortabler gestalten möchtest, kannst Du auch eine Klasse schreiben:

Code: Alles auswählen

class Dummy:pass
glob = Dummy()
glob.c_error = 0
glob.c_autoedit = 0
glob.c_manuedit = 0

def autocorrect(): glob.c_autoedit += 1
def nocorrect(): glob.c_error += 1
def manucorrect(): glob.c_manuedit += 1
Das hat den Vorteil, dass man weitere Methoden hinzufügen kann, z.B. kann man die Hochzählfunktionen als Methoden definieren, so hast Du alles kompakt in einem Objekt.

Ansonsten könntest Du noch die Variablenklasse IntVar aus dem Tkinter-Modul verwenden, das wird aber wahrscheinlich zu umständlich.

Grüße,
der Michel

Verfasst: Donnerstag 8. Juni 2006, 08:49
von stigi
alles klar vielen dank :D

Verfasst: Donnerstag 8. Juni 2006, 09:13
von stigi
haber das jetzt mit dem dictionary gelöst, müsste es aber auch noch in eine txt file ausgeben können

mit

Code: Alles auswählen

file.write("\n--------------------------------\n\n" + glob['c_autoedit'])
funktioniert es leider nicht.
fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "Y:\Mitarbeiter\xxx\pythonwin\correct2.py", line 163, in ?
    file.write("\n--------------------------------\n\n" + glob['c_autoedit'])
TypeError: cannot concatenate 'str' and 'int' objects
die konvertierung in int mit int(glob['c_autoedit']) funktioniert leider da auch nicht :oops:


edit: habs in str konvertiert - so gehts :lol:

Verfasst: Donnerstag 8. Juni 2006, 12:17
von Joghurt

Code: Alles auswählen

...write("\n--------\n%i" % glob["c_autoedit"])