den Namen einer Variable ausdrucken

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
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Freitag 11. Januar 2008, 17:36

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

a=5*3
zeige(a)
die zeile

Code: Alles auswählen

namen = 15

ausgedruckt wird. Ist so etwas überhaupt möglich?
BlackJack

Freitag 11. Januar 2008, 18:09

Das was Du geschrieben hast ist natürlich möglich:

Code: Alles auswählen

def zeige(namen):
    print 'namen =', namen
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)
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Freitag 11. Januar 2008, 18:27

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

Code: Alles auswählen

abcdefghijklmnopqrstuvwxyz = 15
(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.
Zuletzt geändert von Goswin am Montag 12. Januar 2009, 16:01, insgesamt 1-mal geändert.
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Freitag 11. Januar 2008, 18:33

Zusatz: Im Falle von

Code: Alles auswählen

zeige(42)
hätte ich eine Ausgabe

Code: Alles auswählen

42 = 42
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?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Freitag 11. Januar 2008, 18:42

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?
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Freitag 11. Januar 2008, 19:17

Ja, wenn das so ist, bedanke ich mich und nehme das mal zur Kenntnis.

Ich befürchte, eine solche Funktion die aufgerufen wird mit

Code: Alles auswählen

abcdefgh = 3*5
zeige('abcdefgh')
anstelle vom obigen

Code: Alles auswählen

zeige(abcdefgh)
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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Samstag 12. Januar 2008, 10:07

Das ist ja wieder etwas ganz anderes.

Code: Alles auswählen

def zeige(name): print '%s = %s' % ( name, eval(name) )
BlackJack

Samstag 12. Januar 2008, 10:55

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.
lunar

Samstag 12. Januar 2008, 17:52

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')
Antworten