globale variable in funktion verändern ?

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
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Donnerstag 8. Juni 2006, 07:53

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
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Donnerstag 8. Juni 2006, 08:41

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Donnerstag 8. Juni 2006, 08:49

alles klar vielen dank :D
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Donnerstag 8. Juni 2006, 09:13

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:
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Donnerstag 8. Juni 2006, 12:17

Code: Alles auswählen

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