Правильный метод получения входного параметра кадра для трассировки.print_stack()

#python #python-3.x #stack-trace #traceback

Вопрос:

Я пытаюсь использовать traceback.print_stack() для печати стека, ведущего к ошибке, без включения строки, которая фактически печатает стек. например:

 import os
import pathlib
import sys
import traceback


def main():
  path = pathlib.Path('/foo')
  content_bytes = b''
  my_func(path, content_bytes)

def my_func(path, content_bytes):
  for (dirpath, dirnames, filenames) in os.walk(path, onerror=on_error(path)):
    for filename in filenames:
      file: bytes = open(dirpath   "/"   filename, "rb").read()
      content_bytes  = file

def on_error(path):
  traceback.print_stack(sys._getframe(1))
  print("path is not a dir path supplied: {}".format(path))

main()
 

Предполагая, что у меня нет режиссера, названного /foo этим принтом:

 path is not a dir path supplied: /foo
  File "/{projectDir}/examples/test.py", line 22, in <module>
    main()
  File "/{projectDir}/examples/test.py", line 10, in main
    my_func(path, content_bytes)
  File "/{projectDir}/examples/test.py", line 13, in my_func
    for (dirpath, dirnames, filenames) in os.walk(path, onerror=on_error(path)):
 

Как я хочу, но меня беспокоит тот факт, что для этого я вызываю защищенный метод sys _getframe . Pycharm также, похоже, недоволен тем, что я это делаю. Есть ли более подходящий способ получить текущий/предыдущий кадр в стеке, который используется в качестве первого аргумента traceback.print_stack ?

Я вижу много предыдущих ответов SO, основанных на sys.exc_info() , но в данном случае это кортеж, заполненный объектами None.

Комментарии:

1. sys._getframe это не «защищенный системный метод». Это совершенно нормальная, документированная функция. Есть и другие варианты без подчеркивания, но на самом деле они не являются более безопасными или совместимыми или чем-то еще.

2. Pycharm говорит мне: «Не удается найти ссылку «_getframe» в»sys.pyi»». Также в документах python утверждается: «Детали реализации CPython: эта функция должна использоваться только для внутренних и специализированных целей. Это не гарантируется во всех реализациях Python.». Я не должен по какой-то причине прислушиваться к этим предупреждениям? Я бы подумал, что есть какой-то более открытый способ получить это через модуль обратной связи, нет?

3. Также причина, по которой я утверждал, что это защищенный метод, связана с предыдущим подчеркиванием и его значением в соответствии с PEP8 .

4. Дело в том, что это предупреждение относится ко всему существованию объектов стекового фрейма , а не только к этой конкретной функции для их извлечения. Если в реализации Python этого нет sys._getframe , то, вероятно, в ней вообще нет объектов фреймов, поэтому использование другой функции не поможет.

5. Возможно, Pycharm это не обрадует, но вам не нужно беспокоиться.