Ursprünglicher Name einer Variablen/Instanz

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
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Für eine kleine Debug-Ausgabe währe es nicht schlecht, zu wissen, wie der Ursprüngliche Variablen-Name ist.

Ein Beispiel erklärt es wohl besser, was ich will:

Code: Alles auswählen

def Debug ( daten ):
    print "Inhalt von:",name(daten)
    print daten

VariablenName = "BlaBla"
Debug( VariablenName )
Ich hätte gern folgende Ausgaben:

Code: Alles auswählen

Inhalt von: VariablenName
BlaBla
name() ist natürlich nicht der richtige Weg, sondern nur ein Beispiel...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi jens,

leider geht das so nicht, da man zwar Objekte an Namen binden kann (das machst du mit der Zuweisung varname = variable), diese Objekte aber keine Ahnung haben welche Namen sie haben. Hätte auch wenig Sinn, wenn du z.B. an Objekte in Listen oder Tuples.
Du kannst höchstens sowas versuchen:

Code: Alles auswählen

def name(daten):
    for key, value in globals().iteritems():
        if value is daten: # Identisches Objekt?
            return key
    else:
        return "***unknown***"

def Debug ( daten ):
    print "Inhalt von:",name(daten)
    print daten

VariablenName = "BlaBla"
Debug( VariablenName ) 
Versagt aber in vielen Fällen, z.B. bei kleinen Integerwerten oder eben Daten in Listen, Tuples oder Dictionaries.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
oenone
User
Beiträge: 75
Registriert: Mittwoch 27. August 2003, 14:39
Wohnort: 49°17'28N, 8°15'57E
Kontaktdaten:

das wird nicht gehen, da die Debug-funktion gar nicht die variable "VariablenName" kennt... sie bekommt lediglich die variable "daten". deshalb würde sie auch nur diese ausgeben können.

auf bald
oenone
if you don't remember something, it never happened.
if you aren't remembered, you never existed.
i don't quite understand what love is like... but if there was someone who liked me, i'd be happy.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Es war natürlich dafür gedacht, mehrere "Formatierte" Ausgaben einfach zu lösen, (eigentlich Inhalte von Dictionaries):

Code: Alles auswählen

def Debug ( daten ):
    print "Inhalt von:",name(daten)
    print daten,"\n"

VariablenName = "BlaBla"
Debug( VariablenName ) 

AndereVariable = "foobar"
Debug( AndereVariable )

Code: Alles auswählen

Inhalt von: VariablenName
BlaBla

Inhalt von: AndereVariable
foobar

Da es aber wohl nicht so einfach geht, macht es keinen Sinn, denn die Einsparung ist dadurch nicht mehr gegeben...
Eine "einfachere" Lösung, aber mit mehr Handarbeit, ist also Sinnvoller:

Code: Alles auswählen

def Debug ( daten, VarName ):
    print "Inhalt von:",VarName
    print daten,"\n"

VariablenName = "BlaBla"
Debug( VariablenName, "VariablenName" ) 

AndereVariable = "foobar"
Debug( AndereVariable, "AndereVariable" )
oenone
User
Beiträge: 75
Registriert: Mittwoch 27. August 2003, 14:39
Wohnort: 49°17'28N, 8°15'57E
Kontaktdaten:

du koenntest auch eval benutzen...

z.b. so:

Code: Alles auswählen

def Debug( variable ):
    print "Inhalt von:", variable
    print eval( variable ), "\n"

Var1 = "blabla"
Debug( "Var1" )

Var2 = "foobar"
Debug( "Var2" )
auf bald
oenone
if you don't remember something, it never happened.
if you aren't remembered, you never existed.
i don't quite understand what love is like... but if there was someone who liked me, i'd be happy.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

und was bringt eval da?

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Im obrigen Beispiel würde es ja gehen... Mittlerweile hab ich weiter gebastelt und nun ist es nicht mehr einfach eine Variable, sondern ein Rückgabewert einer Funktion... Da wäre der Funktionsname interessant...

Naja, mit meiner billig-von-hand-mach-lösung komm ich schon zurecht...
oenone
User
Beiträge: 75
Registriert: Mittwoch 27. August 2003, 14:39
Wohnort: 49°17'28N, 8°15'57E
Kontaktdaten:

Dookie hat geschrieben:und was bringt eval da?

Dookie
ohne eval wuerde es nur den namen der variablen, nicht deren inhalt ausgeben.

auf bald
oenone
if you don't remember something, it never happened.
if you aren't remembered, you never existed.
i don't quite understand what love is like... but if there was someone who liked me, i'd be happy.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

agso, klar, solltest aber besser als Parameterbezeichner dann variablenname verwenden statt variable.

Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten