2016-11-08 3 views
0

Ich habe eine Python-Klasse mit mehreren verschiedenen Methoden, die verschiedene Dinge tun, aber ich möchte, dass jeder von ihnen, wenn es ausgeführt wird, seine Namen und Argumentwerte zu speichern, so dass ich kann benutze sie später. Ein Weg, ich fand ist, so etwas zu jeder von ihnen hinzuzufügen:So speichern Sie Klassenmetadaten in Python

frame = inspect.currentframe() 
args, _, _, values = inspect.getargvalues(frame) 
function_name = inspect.getframeinfo(frame)[2] 
function_meta = {arg: values[arg] for arg in args} 
self.meta[function_name] = function_meta 

Das ist in Ordnung, aber ich würde es vorziehen, sie trocken zu halten und muß nicht kopieren/einfügen diesen identisch Snippet jede Methode ich füge hinzu.

Alternativ könnte ich es in eine separate Funktion drehen save_meta(), aber dann inspect werden die Daten von save_meta() anstelle der Funktion zurück, die sie aufgerufen, nicht wahr? Gibt es eine elegante und wiederverwendbare Möglichkeit, dies zu lösen?

Antwort

1

Sie scheinen nur auf den aktuellen Rahmen für die inspect angewiesen zu sein. Ich würde

def save_meta(frame): 
    args, _, _, values = inspect.getargvalues(frame) 
    function_name = inspect.getframeinfo(frame)[2] 
    function_meta = {arg: values[arg] for arg in args} 
    self.meta[function_name] = function_meta 

vorschlagen Und nennen Sie es mit

save_meta(inspect.currentframe()) 
+0

Ah verdammt, du hast recht, das war ziemlich einfach. :) Vielen Dank! Bonusfrage: Gibt es einen einfacheren Weg dies zu tun? – machaerus

+0

@machaerus Sorry, ich habe deine Frage gerade gesehen. Was meinst du mit leichter? – pingul

+0

Ich dachte, dass es vielleicht einen Weg gibt, dies zu tun, ohne eine benutzerdefinierte Funktion zu schreiben. Es scheint eine ziemlich grundlegende Funktionalität zu sein, ich bin irgendwie überrascht, dass es dafür keine eingebaute Methode gibt. – machaerus

Verwandte Themen