inspect.currentframe () может не работать в некоторых реализациях? - PullRequest
3 голосов
/ 30 марта 2012

В соответствии с документами :

inspect.currentframe()

Возвращает объект frame для стекового кадра вызывающего.

Реализация CPythonдеталь: эта функция опирается на поддержку фрейма стека Python в интерпретаторе, которая не гарантируется во всех реализациях Python.Если выполняется в реализации без поддержки фреймов стека Python, эта функция возвращает None.

Как получается, что только эта функция помечена как "зависящая от реализации"?Если эта функция не работает, не будут ли недоступны аналогичные функции, такие как inspect.trace, inspect.stack и т. Д.?

Кроме того, что означает «поддержка стекового фрейма» и почемуэто когда-либо отсутствовало?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2016

Наткнулся на этот вопрос, когда сам искал ответ. Наличие inspect.currentframe привязано к 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

Таким образом, ограничение распространяется на все другие функции, также использующие sys._getframe. Для inspect это только inspect.stack.

Напротив, inspect.trace использует sys.exc_info. Это является неотъемлемой частью схем обработки исключений и всегда должно быть доступно. Все другие связанные функции, например getframeinfo, уже полагайтесь на то, что есть рамка. Их применимость зависит от того, хотите ли вы проверить исключение или вызвать обратный вызов.

Обратите внимание, что мой локальный jython по умолчанию поддерживает sys._getframe. ipy работает, если работает с -X:Frames.

2 голосов
/ 30 марта 2012

Другими реализациями, на которые ссылаются документы, являются Jython и IronPython. Это реализации языка Python, которые работают в другой виртуальной машине (JVM и CLR) и не имеют такого стекового фрейма. Однако я думаю, что позже IronPython добавил некоторую поддержку для этого.

...