Ich versuche Informationen über Abstürze zu sammeln und habe Probleme herauszufinden, wie man die Globals, die in der abgestürzten Funktion verwendet werden, bekommt.
%Vor%test () verwendet nur "Spaß", aber f_globals gibt alle verfügbaren globalen Werte an. Gibt es eine Möglichkeit, nur die Globals zu erhalten, die von dieser Funktion verwendet werden?
Das habe ich auch selbst gebraucht. Das ist meine Lösung. Der nicht schnelle Pfad deckt die meisten Fälle ab, für die Sie sich wahrscheinlich interessieren.
%Vor%Eine aktualisierte Version könnte hier sein.
Mein Anwendungsfall:
Ich habe ein Modul ( songdb
), das einige globale Datenbankobjekte enthält, und ich wollte sie langsam laden, sobald ich eine Funktion aufgerufen habe, die die globale Datenbankvariable verwendet. Ich hätte solche Funktionen manuell mit einem Lazy Loader versehen können oder ich könnte automatisch erkennen, welche Funktionen es von meiner Funktion iterGlobalsUsedInFunc
benötigt.
Dies ist im Grunde der Code ( vollständiger Code ; wurde eigentlich jetzt für Klassen erweitert ), wobei init
automatisch solche Funktionen schmückt:
Eine andere Lösung wäre gewesen, einen Objekt-Proxy zu verwenden, der die Datenbank langsam lädt. Ich habe das an anderer Stelle in diesem Projekt verwendet, also habe ich auch einen solchen Objekt-Proxy implementiert; Wenn Sie interessiert sind, sehen Sie hier: utils.py : ObjectProxy
.
Wie Sie bereits herausgefunden haben, gibt Ihnen die Eigenschaft f_globals
den globalen Namensraum, in dem die Funktion definiert wurde.
Was ich sehen kann, ist der einzige Weg herauszufinden, welche globalen Variablen tatsächlich verwendet werden, den Bytecode der Funktion mit dis ; Suchen Sie nach den Bytecodes STORE_NAME , STORE_GLOBAL , DELETE_GLOBAL usw.
Tags und Links python error-handling