auf instanznamen zugreifen

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
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

Nope, das geht nicht. Wäre auch nicht eindeutig, denn Objekte können an beliebig viele, oder auch gar keinen Namen gebunden sein.
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

schade.

@hyperion: mit Instanzname meine ich den variablennamen, den man bei der Erschaffung verwendet.
lunar

Wofür hättest du das den benötigt?
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

ich wollte eine Fehlerausgabe machen, die mir sagt wie das Ding heißt was nicht tut.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

ja ich wollte eben sagen: Fehler in der und der Funktion beim bearbeiten von diesem Punktobjekt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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? :shock:
Benutzeravatar
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:

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?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
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
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

@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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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()
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

@birkenfeld: Bin ich zu blind, oder ist die erste ``while``-Schleife, die `frame` ermittelt, sinnfrei, weil `frame` gar nicht verwendet wird!?
Benutzeravatar
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:

Code: Alles auswählen

    frame = sys._getframe()
    for frame in iter(lambda: frame.f_back, None):
        frame.f_locals
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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().
Antworten