traceback.print_stack()获取帧输入参数的正确方法 避免使用sys._getframe
解决方案
你可以用以下两种标准库公开API实现需求,完全避免调用sys._getframe这类受保护方法:
方案1:使用inspect.currentframe获取栈帧(最接近原有实现)
inspect.currentframe是Python官方公开的栈帧获取接口,和sys._getframe功能等价,不会触发IDE警告。你只需要修改on_error函数如下:
import os import pathlib import sys import traceback import inspect # 新增导入 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): # 取当前帧的上一层帧,完全等价于原有sys._getframe(1)的效果 caller_frame = inspect.currentframe().f_back traceback.print_stack(caller_frame) print("path is not a dir path supplied: {}".format(path)) main()
运行后输出和你原有实现完全一致。
方案2:直接调整栈打印的层数(无需操作栈帧对象)
如果不想和栈帧对象直接交互,可以直接用traceback模块自带的切片能力,过滤掉不需要的栈层:
def on_error(path): # 去掉最后1层栈(就是当前on_error函数内的执行栈),输出和原效果一致 stacks = traceback.extract_stack()[:-1] print(''.join(traceback.format_list(stacks))) print("path is not a dir path supplied: {}".format(path))
这个方案兼容性更强,不需要依赖平台对栈帧对象的支持。
你之前查的sys.exc_info()相关方案确实不适用你的场景:这类方案需要有实际异常抛出才能拿到栈信息,而你是在无异常的场景下主动打印调用栈,自然返回的都是None。
内容的提问来源于stack exchange,提问作者topher217
相关产品推荐
相关产品推荐

