Wie bekomme ich in Python die globalen Variablen, die in einer Funktion verwendet werden?

9

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?

    
Pat Corwin 25.03.2011, 16:32
quelle

4 Antworten

3

Sieh dir das an

%Vor%     
Rumple Stiltskin 25.03.2011 17:11
quelle
1

Ein schmutziger Weg wäre, inspect.getsourcelines() zu verwenden und nach Zeilen zu suchen, die global <varname> enthalten. Dafür gibt es keine guten Methoden, zumindest nicht in inspect modul.

    
pajton 25.03.2011 16:39
quelle
1

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:

%Vor%

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 .

    
Albert 09.11.2012 16:45
quelle
0

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.

    
Aaron Digulla 25.03.2011 16:42
quelle

Tags und Links