Problem: Globale Variable in Funktion/Klasse definieren

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
TheBen
User
Beiträge: 4
Registriert: Dienstag 2. August 2011, 19:42

Hallo allseits,

ich hab ein kleines Problem. Es betrifft die Definition von globalen Variablen aus einer Funktion/Klasse heraus.

Auf diese Weise funktioniert die Definition wie in vielen Tutorien beschrieben:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

def test():
        global a
        a=5
test()
print "a="+str(a)
und ergibt Möchte ich jedoch die Definition der Variablen von einer bestehenden Liste ableiten, wie zum Beispiel hier:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

def test(liste):
	for i in range(0,len(liste),1):
		liste[i]=liste[i].split(',')
		exec("global "+liste[i][0])
		print "global "+liste[i][0]
		exec(liste[i][0]+"="+liste[i][1])
		print liste[i][0]+"="+liste[i][1]

liste=['a,3','b,6']
test(liste)
print a 
bekomme ich immer die Antwort, dass die Variable a nicht definiert sei.

Code: Alles auswählen

global a
a=3
global b
b=6
Traceback (most recent call last):
  File "./test2.py", line 14, in <module>
    print a
NameError: name 'a' is not defined
Ich habe oben die exec-Zeilen zusätzlich printen lassen und sie ergeben genau den Code den ich ausführen möchte (global a, global b, a=3 und b=6). Ich verstehe nicht, warum der über Exec ausgeführte Code nicht die Funktion eines direkt eingegebenen Codes erfüllt.
Für Hilfe wäre ich sehr dankbar.

Grüße
Ben
problembär

Ich würde auf globale Variablen soweit wie möglich verzichten und behaupte, man kommt ganz ohne aus. Der Grund ist, man kommt manchmal durcheinander, wenn man ganz woanders eine globale Variable definiert hat, die man inzwischen vergessen hat. Dadurch verursachte Fehler sind schwer zu finden, denn man erhält ja erstmal keine Fehlermeldung, weil die Variable ja definiert ist.

Wenn überhaupt, dann würde ich sie skriptweit definieren, etwa für Konstanten (die man dann (nach der Konvention) auch groß schreibt):

Code: Alles auswählen

#!/usr/bin/python
# coding: iso-8859-1

PI = 3.14159

def test():
    print "In Function: PI = " + str(PI)

test()
print "PI = " + str(PI)
lunar

@TheBen: Aus der Dokumentation:
Programmer’s note: the global is a directive to the parser. It applies only to code parsed at the same time as the global statement. In particular, a global statement contained in an exec statement does not affect the code block containing the exec statement, and code contained in an exec statement is unaffected by global statements in the code containing the exec statement. The same applies to the eval(), execfile() and compile() functions.
Es hat mich gefreut, Dir die Dokumentation vorlesen zu dürfen...

Wenn Du "exec()" brauchst, um Quelltext, noch dazu globale Variablen, zu erzeugen, dann machst Du ohnehin etwas grundlegend falsch. "exec()" ist eine Anweisung für absolute Ausnahmefälle, und wäre Dein Vorhaben so ein Ausnahmefall, dann müsstest Du gar nicht fragen, weil man sich schon sehr, sehr gut mit Python auskennen muss, um überhaupt auf solche Sonderfälle zu stoßen.

Erkläre doch bitte, was Du eigentlich bezweckst, dann können wir Dir eine vernünftige Lösung ohne "global" und "exec" aufzeigen.
TheBen
User
Beiträge: 4
Registriert: Dienstag 2. August 2011, 19:42

Hey,

vielen Dank für Eure Antworten. Bin noch recht neu in der objektorientieren und in der Python-Programmierung, daher sei es mir verziehen, dass meine Frage wohl etwas daneben war. Ich habe mir zu Herzen genommen, dass man möglichst die globale Definition von Variablen vermeidet und unterdessen auch mit vordefinierten Klassen mein Ziel erreicht.

Grüße
Ben
Antworten