gpt4 book ai didi

frame - 如何重写回溯中的特定帧?

转载 作者:行者123 更新时间:2023-11-28 22:03:51 25 4
gpt4 key购买 nike

在 python 中,您可以使用 exec() 更快地执行 compile() 字符串。但是我一使用它,当执行程序发生异常时我们就丢失了信息。

例如,这里是调用未知方法的代码片段(用于演示目的):

code = 'my_unknown_method()'
bytecode = compile(code, '<string>', 'exec')

然后,我在该字节码上调用 exec:

exec bytecode

显示的回溯是:

Traceback (most recent call last):
File "test.py", line 3, in <module>
exec bytecode
File "<string>", line 1, in <module>
NameError: name 'my_unknown_method' is not defined

“exec()”框架现在变得模糊不清。我想要一个更好的异常(exception),例如:

Traceback (most recent call last):
File "test.py", line 3, in <module>
exec "my_unknown_method()"
File "<string>", line 1, in <module>
NameError: name 'my_unknown_method' is not defined

有什么想法吗?

注意事项:

  • 我不想使用编译的第二个参数(文件名)
  • 我已经测试过在框架上检查和修改 f_code,但它是只读属性。

编辑:在查看更多 sys.excepthook 之后,我在 python source code/traceback.c 中看到,当 python 想要显示行内容时,如果找到,它们会直接 fopen() 文件。根本没有可用的 Hook 来显示我们自己的内容。唯一的方法是在磁盘上创建真实的假文件名?有人吗?

EDIT2:我检查了一些 jinja2 调试代码,他们也在重写回溯,但不是针对内容。除了钩子(Hook),我需要定制吗?我对它的担忧是因为它不在回溯本身中,如果用户/模块/任何异常,回溯将不包含有值(value)的信息。

最佳答案

你应该看看this talk阿明·罗纳彻 (Armin Ronacher) 着。他是 Jinja2 的作者,在这次演讲中他解释了他如何在 Jinja2 中操作堆栈跟踪。如果我没记错的话,他正在使用 ctypes 在 Python 的 C 级别上操作数据结构。顺便说一句,在我看来,这次演讲是整个 Europython 2011 中最好的演讲。

关于frame - 如何重写回溯中的特定帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8181532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com