Seite 1 von 1

Den Namen einer Variable ausgeben, nicht deren Wert

Verfasst: Dienstag 18. Dezember 2007, 16:40
von sponk
Hallo!

Habe folgendes Problem:
Ich habe eine Funktion definiert und möchte als Ausgabe den Variablennamen und nicht dessen Wert.

Stelle mir das so in der Art vor:

Code: Alles auswählen

def func(x):
 print str(x)
Jetzt würde ich gerne für func(A) einfach ein 'A' ausgegeben bekommen und nicht den Wert davon.

Danke und Grüße!

Verfasst: Dienstag 18. Dezember 2007, 16:59
von Darii

Code: Alles auswählen

print 'A'
Was willst du denn machen? So wie du dir das vorstellst, wird das nicht funktionieren. Das Objekt x enthält ja keine Informationen darüber, wie es gerade heißt oder hieß(intern wird das vom Interpreter evtl. irgendwo gespeichert, aber da kommt man nicht dran).

Stell dir die Variable(den Namen des Objekts) wie einen Klebezettel vor, der an dem Objekt klebt. Das Objekt weiß weder durch welchen der vielen Klebezettel die auf ihm kleben es gerade gefunden wurde noch was auf der anderen Seite der Zettel steht.

Verfasst: Dienstag 18. Dezember 2007, 17:02
von BlackVivi
Ich weiß, was du machen willst... und weiß spontan 2 Lösungen:

Du arbeitest mit **kwargs oder direct mit einem Dict.

Code: Alles auswählen

def foo(**kwargs):
    for i, j in kwargs.iteritems():
        print i + ": " + j

foo(A="abc, B="bcs")
Und bei Dicts solltest du dich selber mal durchlesen...

Verfasst: Dienstag 18. Dezember 2007, 17:03
von CM
Klar "weiß" eine Funktion welche "Variablen" sie hat:

Code: Alles auswählen

def foo(x): print locals()
Aber: Was willst Du denn tatsächlich erreichen? Vielleicht gibt es ja eine etwas pythonischere Herangehensweise?

Gruß,
Christian

Verfasst: Dienstag 18. Dezember 2007, 17:05
von sponk
Na gut, dann muss ich doch weiter ausholen:

ich will eine Funktion schreiben, mit der man Matrizen auf ihre Symmetrie untersuchen kann. Da ich das für verschiedene Matrizen anwenden will, hab ich folgedes geschrieben:

Code: Alles auswählen

def symm(x):
	if all(x.transpose() == x):
		print str(x)+' ist symmetrisch!'
	else:
		print str(x)+' ist nicht symmetrisch!'
wenn ich nun eine Matrix A (wird vorgegeben) habe und den Befehl symm(A) ausfühe, soll eben "A ist symmetrisch!" bzw. "A ist nicht symmetrisch" rauskommen.

Verfasst: Dienstag 18. Dezember 2007, 17:07
von BlackJack
@sponk: Es gibt Namen und Objekte. An ein Objekt kann man beliebig viele Namen binden, oder auch gar keinen. Damit weiss man nicht *welchen* Namen, aus welchem Namensraum man ausgeben kann/soll, bzw. was soll man machen wenn ein Objekt an gar keinen Namen gebunden ist!?

Was sollte die hypothetische Funktion hier jeweils ausgeben?

Code: Alles auswählen

a = b = 42
func(a)
func(b)
func(42)
func(23)
func(int())
c = [a + 1]
func(c[0])
Die Ausgabe musst Du an der Stelle machen wo Du weisst, dass der Name `A` ist. Anders geht das nicht.

@CM: `locals()` kennt `x` weiss aber nicht das das Objekt auch unter dem Namen `A` erreichbar ist.

Verfasst: Dienstag 18. Dezember 2007, 17:12
von CM
BlackJack hat geschrieben:@CM: `locals()` kennt `x` weiss aber nicht das das Objekt auch unter dem Namen `A` erreichbar ist.
Wohl wahr. Habe ich gerade glatt ignoriert. Sorry.

Verfasst: Samstag 29. März 2008, 11:17
von jens
sponk hat geschrieben:wenn ich nun eine Matrix A (wird vorgegeben) habe und den Befehl symm(A) ausfühe, soll eben "A ist symmetrisch!" bzw. "A ist nicht symmetrisch" rauskommen.
Dann übergib doch nicht nur die Werte, sondern auch den Namen der Matrix. Das wäre eine saubere Lösung. Oder erstelle ein dict und übergib das, z.B.:

Code: Alles auswählen

matrix = {
    "name": "Die Matrix A",
    "werte": ...
}
Die Frage ist: Woher kommt die Matrix, der Namen und die Daten?