Ich möchte eine Protokollfunktion definieren, die mit einer Nachricht gefolgt von einer oder mehreren Variablen zum Ausdrucken aufgerufen wird. Also, so etwas wie die folgenden:Wie drucke ich die Variablenargumente mit Namen aus dem vorherigen Stapel?
log("Oh no, error.", x, d)
Protokoll definiert werden würde sorta mag:
def log(msg, *arg):
# Loop through arg, printing caller's variable's name and value.
Das in eine Datei die folgende Protokoll würde:
Oh no, error.
x = 5
d = { foo: "Foo", goo: "Goo" }
Kann man das überhaupt getan werden ? Ich kann Locals und Argumente mit inspect drucken, aber ich weiß nicht, ob ich Werte im aktuellen Frame durchlaufen kann, indem ich die Variablennamen eines vorherigen Frames verwende. (
locals
in
inspect.getargvalues(previousFrame)
hat die Namen, aber viele andere Namen auch.)
Wie bestimmen Sie die Variablennamen eindeutig? Was wäre, wenn der Aufrufer im Namensraum "y" hätte und sein Wert auch "5" wäre? Was passiert, wenn der Anrufer etwas wie "d ['foo']" übergibt? Müssen Sie beliebig tief in die Objekte im Namespace des Aufrufers recurren? Was ist, wenn sie das Ergebnis eines Funktionsaufrufs übergeben? 'log ('Nachricht', x.bar())'? Es gibt viele Fälle, die hier ziemlich schwer zu lösen sind ... obwohl Sie wahrscheinlich den Stack inspizieren und _all_ der lokalen Variablen des Aufrufers ausdrucken könnten. – mgilson
* seufz * Ja, ich denke du bist richtig mgilson. Also was soll ich tun? Muss ich diesen Beitrag löschen? Oder vielleicht ist es mein Wunschdenken, ich möchte nur eine Protokollfunktion, die die Variablen protokolliert, die ich ihr gebe. Das kann überhaupt nicht gemacht werden? Also, wenn sie 5 übergeben, wird 5 = 5 ausgegeben. Wenn sie an y übergeben werden, wird y = 5 ausgegeben. Wenn sie ein Objekt übergeben, wird Objekt = str (Objekt) ausgegeben. – Bitdiot
@Bitdiot, warum? Es ist nicht schlecht geschrieben oder schlecht organisiert. Und für mich persönlich ist die Frage interessant – ForceBru