Seite 1 von 1
den Namen einer Variable ausdrucken
Verfasst: Freitag 11. Januar 2008, 17:36
von Goswin
Ich hätte gerne eine Funktion erstellt,
Code: Alles auswählen
def zeige(namen):
print namen.__namen__, '=', namen #FALSCH
so dass bei
die zeile
ausgedruckt wird. Ist so etwas überhaupt möglich?
Verfasst: Freitag 11. Januar 2008, 18:09
von BlackJack
Das was Du geschrieben hast ist natürlich möglich:
Das was Du wahrscheinlich gemeint hast, ist nicht möglich. Objekte können keinen oder beliebig viele Namen haben, kennen diese aber nicht.
Was sollte `zeige()` denn zum Beispiel in diesen Fällen ausgeben:
Code: Alles auswählen
zeige(42)
xs = [42]
zeige(xs[0])
a = 42
b = a
zeige(a)
zeige(b)
Verfasst: Freitag 11. Januar 2008, 18:27
von Goswin
Ich hätte gerne eine Funktion erstellt,
Code: Alles auswählen
def zeige(namen):
print namen.__namen__, '=', namen #FALSCH
so dass bei
Code: Alles auswählen
abcdefghijklmnopqrstuvwxyz = 5*3
zeige(abcdefghijklmnopqrstuvwxyz)
die zeile
(Ich bitte um Entschuldigung für den Tippfehler in der ersten Frage)
Vielleicht ist das wirklich nicht möglich. Natürlich kann ein Objekt nicht die Pointers kennen, die darauf zeigen, aber: ich will ja nicht auf einen beliebigen Namen des Objektes zugreifen, sondern auf das Aufrufe-Argument einer Funktion, und das sollte ja eindeutig bestimmt sein! Ich möchte die Referenzierung irgendwie abfangen, bevor sie stattfindet. So etwas wäre nützlich, da ich dann nicht:
Code: Alles auswählen
print 'abcdefghijklmnopqrstuvwxyz =', abcdefghijklmnopqrstuvwxyz
schreiben müsste mit dem entsprechenden Tippfehler-Risiko.
Verfasst: Freitag 11. Januar 2008, 18:33
von Goswin
Zusatz: Im Falle von
hätte ich eine Ausgabe
erwartet. Was ich als Argument eingebe (also hier '42') kann doch unmöglich das Objekt selber sein, sondern höchstens der String '42'. Oder sehe ich das Ganze falsch?
Verfasst: Freitag 11. Januar 2008, 18:42
von Darii
Goswin hat geschrieben:aber: ich will ja nicht auf einen beliebigen Namen des Objektes zugreifen, sondern auf das Aufrufe-Argument einer Funktion, und das sollte ja eindeutig bestimmt sein!
Ja das ist es, das Argument ist aber das Objekt selbst und nicht sein Name.
Ich möchte die Referenzierung irgendwie abfangen, bevor sie stattfindet. So etwas wäre nützlich, da ich dann nicht:.
Da gibt es keine Referenzierung die es abzufangen gäbe.
Goswin hat geschrieben:erwartet. Was ich als Argument eingebe (also hier '42') kann doch unmöglich das Objekt selber sein, sondern höchstens der String '42'. Oder sehe ich das Ganze falsch?
Ja du siehst das falsch, was du da als Argument übergibt, ist das tatsächlich das "Objekt 42", was in diesem Fall übrigens keinen Namen hat(die 42 ist ein Literal).
Ich weiß ja nicht was du tun willst, aber suchst du vielleicht nicht einfach einen Debugger?
Verfasst: Freitag 11. Januar 2008, 19:17
von Goswin
Ja, wenn das so ist, bedanke ich mich und nehme das mal zur Kenntnis.
Ich befürchte, eine solche Funktion die aufgerufen wird mit
anstelle vom obigen
gibt es wohl auch nicht.
Ich habe die Angewohnheit, während des Programmierens viele Zwischenergebnisse auszugeben, die ich am Ende wieder zurückhalte. Vielleicht nennt man das Debugging, auch wenn da keine Bugs vorhanden sind; gewisserma3en ein vorbeugendes Debugging.
Verfasst: Samstag 12. Januar 2008, 10:07
von Darii
Das ist ja wieder etwas ganz anderes.
Code: Alles auswählen
def zeige(name): print '%s = %s' % ( name, eval(name) )
Verfasst: Samstag 12. Januar 2008, 10:55
von BlackJack
Wobei dort `name` natürlich in einem ganz anderen Kontext ausgeführt wird als wenn das direkt als Ausdruck angegeben würde. Beispiel:
Code: Alles auswählen
def zeige(name):
print '%s = %s' % (name, eval(name))
def test():
a = 42 + 23
zeige('a')
test()
Gibt einen ``NameError: name 'a' is not defined``. Man müsste also schon auf "Stack-Hacks" setzen um an den Kontext des Aufrufers zu kommen. Und da wird's dann IMHO etwas zu magisch für normalen Quelltext.
Verfasst: Samstag 12. Januar 2008, 17:52
von lunar
Das Inspect-Modul kann dir helfen:
Code: Alles auswählen
import inspect
def print_caller_argument_values():
caller = inspect.currentframe().f_back
name = inspect.stack()[1][3]
print name + inspect.formatargvalues(*inspect.getargvalues(caller))
def foo(bar, baz='foo'):
print_caller_argument_values()
foo('hallo')
# >> foo(bar='hallo', baz='foo')