Hi
Kann ich auf den Variablennamen einer Instanz irgendwie zugreifen?
Es geht um eine Funktion die mir den Namen zusammen mit ein paar Werten ausgeben soll.
grüße,
4bit.
auf instanznamen zugreifen
Nope, das geht nicht. Wäre auch nicht eindeutig, denn Objekte können an beliebig viele, oder auch gar keinen Namen gebunden sein.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ist denn da der Name entscheidend? Eigentlich geht es doch eher um die Stelle im Programm und um den "Dateninhalt", der einen Fehler wirft. Woher das kann kommt, findet man dann doch normal schnell manuell raus.4bit hat geschrieben:ich wollte eine Fehlerausgabe machen, die mir sagt wie das Ding heißt was nicht tut.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ja, das ist mir schon klar. Aber was hilft denn da der konkrete Name? Ich meine die Daten des Objektes stammen ja von irgend wo. Das sollte man doch auch ohne Namen finden, indem man die Werte als Info erhält? Kannst Du evtl. mal Deinen Code zeigen, bei dem das wirklich nötig ist?4bit hat geschrieben:ja ich wollte eben sagen: Fehler in der und der Funktion beim bearbeiten von diesem Punktobjekt.
Wenn Du so viele "Punkt"-Objekte hast, dann stehen die doch hoffentlich in einer Liste o.ä. Oder bindest Du die wirklich alle an einen eigenen Namen?

- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Wenn du Exceptions benutzt, passiert das doch schon automatisch:
Oder wo ist das Problem?
Code: Alles auswählen
>>> def foo():
... raise ValueError("Oops...")
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
ValueError: Oops...
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
@Rebecca: Nee, ich habe ihn so verstanden:
Code: Alles auswählen
def foo(param):
raise Exception(magic_code)
# und dann
a = 5
foo(a)
# was dazu führt
Traceback (most recent call last):
...
Error: Oops... Variable 'a' had bad content
@rebecca: Seh ich grad nicht, wie das den Namen der Variablen ausgibt, die von foo bearbeitet wurde, als der Fehler aufgetreten ist. Aber das ist auch garnicht möglich, wie blackjack behauptet.
Trotzdem guter Tip mit den exceptions.
@hyperion: ja genau.
Trotzdem guter Tip mit den exceptions.
@hyperion: ja genau.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Nicht nur behauptet -- es ist so.4bit hat geschrieben:@rebecca: Seh ich grad nicht, wie das den Namen der Variablen ausgibt, die von foo bearbeitet wurde, als der Fehler aufgetreten ist. Aber das ist auch garnicht möglich, wie blackjack behauptet.
Okay, das ist nicht die ganze Wahrheit. ACHTUNG: Der untenstehende Code ist keine Lösung zu deinem Problem -- wenn dein Objekt einen Namen haben soll, muss es diesen selbst wissen -- aber zeigt die ganze Wahrheit.
Code: Alles auswählen
import gc, sys
def find_names(obj):
frame = sys._getframe(1)
while True:
frame.f_locals
if not frame.f_back:
break
frame = frame.f_back
result = []
for referrer in gc.get_referrers(obj):
if isinstance(referrer, dict):
for k, v in referrer.iteritems():
if v is obj:
result.append(k)
return result
def demo():
a = []
print find_names(a)
demo()
@birkenfeld: Bin ich zu blind, oder ist die erste ``while``-Schleife, die `frame` ermittelt, sinnfrei, weil `frame` gar nicht verwendet wird!?
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Probiers einfach mal ohne die Schleife 
BTW, so wird der do-while loop eleganter:

BTW, so wird der do-while loop eleganter:
Code: Alles auswählen
frame = sys._getframe()
for frame in iter(lambda: frame.f_back, None):
frame.f_locals
Und wenn es reicht, lokal und global zu schauen, geht auch sowas:
id() muss man hier verwenden, da das Dictionary ja explizit nach Identität und nicht nach Wert (hash) orden soll. Lokal dann natürlich locals().
Code: Alles auswählen
In [1]: testname = "foobar"
In [2]: from collections import defaultdict
In [3]: d = defaultdict(list)
In [4]: for k, v in globals().copy().iteritems():
...: d[id(v)].append(k)
...:
...:
In [6]: print repr(d[id(testname)])
['testname']
In [7]: print repr(d[id(d)])
['d']