Seite 1 von 1
auf instanznamen zugreifen
Verfasst: Freitag 29. Mai 2009, 14:11
von 4bit
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.
Verfasst: Freitag 29. Mai 2009, 14:20
von Hyperion
Kannst Du Dein Ziel noch mal ein wenig besser erläutern? Das klingt erst mal ziemlich sinnfrei ... ich vermute da gibt es eine sinnvolle Lösung.
Verfasst: Freitag 29. Mai 2009, 14:21
von BlackJack
Nope, das geht nicht. Wäre auch nicht eindeutig, denn Objekte können an beliebig viele, oder auch gar keinen Namen gebunden sein.
Verfasst: Freitag 29. Mai 2009, 14:50
von 4bit
schade.
@hyperion: mit Instanzname meine ich den variablennamen, den man bei der Erschaffung verwendet.
Verfasst: Freitag 29. Mai 2009, 14:53
von lunar
Wofür hättest du das den benötigt?
Verfasst: Freitag 29. Mai 2009, 15:01
von 4bit
ich wollte eine Fehlerausgabe machen, die mir sagt wie das Ding heißt was nicht tut.
Verfasst: Freitag 29. Mai 2009, 15:06
von Hyperion
4bit hat geschrieben:ich wollte eine Fehlerausgabe machen, die mir sagt wie das Ding heißt was nicht tut.
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.
Verfasst: Freitag 29. Mai 2009, 15:15
von 4bit
ja ich wollte eben sagen: Fehler in der und der Funktion beim bearbeiten von diesem Punktobjekt.
Verfasst: Freitag 29. Mai 2009, 15:21
von Hyperion
4bit hat geschrieben:ja ich wollte eben sagen: Fehler in der und der Funktion beim bearbeiten von diesem Punktobjekt.
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?
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?

Verfasst: Freitag 29. Mai 2009, 15:24
von Rebecca
Wenn du Exceptions benutzt, passiert das doch schon automatisch:
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...
Oder wo ist das Problem?
Verfasst: Freitag 29. Mai 2009, 15:34
von Hyperion
@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
Verfasst: Freitag 29. Mai 2009, 15:49
von 4bit
@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.
Verfasst: Samstag 30. Mai 2009, 12:00
von birkenfeld
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.
Nicht nur behauptet -- es ist so.
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()
Verfasst: Samstag 30. Mai 2009, 12:08
von BlackJack
@birkenfeld: Bin ich zu blind, oder ist die erste ``while``-Schleife, die `frame` ermittelt, sinnfrei, weil `frame` gar nicht verwendet wird!?
Verfasst: Samstag 30. Mai 2009, 12:10
von birkenfeld
Probiers einfach mal ohne die Schleife
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
Verfasst: Samstag 30. Mai 2009, 17:41
von str1442
Und wenn es reicht, lokal und global zu schauen, geht auch sowas:
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']
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().