2012-03-30 8 views
3

Nach dem docs:inspect.currentframe() funktioniert möglicherweise nicht unter einigen Implementierungen?

inspect.currentframe()

Return das Frame-Objekt für den Stapel Rahmen des Anrufers.

CPython-Implementierungsdetail: Diese Funktion basiert auf Python-Stack Frame-Unterstützung im Interpreter, der nicht in alle Implementierungen von Python garantiert ist. Wenn in einer Implementierung ohne Python-Stack-Frame-Unterstützung ausgeführt wird, gibt diese Funktion None zurück.

Wie wird nur diese Funktion als "implementierungsabhängig" gekennzeichnet? Wenn diese Funktion nicht funktioniert, wären ähnliche Funktionen, wie inspect.trace, inspect.stack usw. ebenfalls nicht verfügbar?

Auch, was bedeutet "Stack-Frame-Unterstützung", und warum würde es jemals fehlen?

Antwort

2

Stolperte über diese Frage, während ich selbst nach der Antwort suchte. Die Verfügbarkeit von inspect.currentframe ist gebunden an sys._getframe:

def currentframe(): 
    """Return the frame of the caller or None if this is not possible.""" 
    return sys._getframe(1) if hasattr(sys, "_getframe") else None 

Die Beschränkung somit auf alle anderen Funktionen gilt auch sys._getframe verwenden. Für inspect ist dies nur inspect.stack.

Im Gegensatz inspect.trace verwendet sys.exc_info. Dies ist ein wesentlicher Bestandteil von Ausnahmebehandlungsschemata und sollte immer verfügbar sein. Alle anderen verwandten Funktionen, z.B. getframeinfo, verlassen Sie sich bereits auf einen Rahmen. Ihre Anwendbarkeit hängt davon ab, ob Sie eine Ausnahmebedingung prüfen oder eine Rückverfolgung aufrufen möchten.

Beachten Sie, dass meine lokale, Standard-Jython Unterstützung sys._getframe unterstützt. ipy funktioniert, wenn es mit -X:Frames ausgeführt wird.

2

Die anderen Implementierungen, auf die sich die Dokumente beziehen, sind Jython und IronPython. Dies sind Python-Implementierungen, die auf einer anderen VM (JVM und CLR) ausgeführt werden und keinen solchen Stack-Frame haben. Ich denke, IronPython hat später etwas Unterstützung dafür hinzugefügt.

+0

Aber wie kommt es, dass nur 'inspect.currentframe' nicht unterstützt wird, aber' inspect.trace' und 'inspect.stack' funktionieren gut? (Das ist was die Docs implizieren.) – max