#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 это не обрадует, но вам не нужно беспокоиться.