gpt4 book ai didi

exec 中字符串的 python 回溯?

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:18 25 4
gpt4 key购买 nike

我有一个存储在字符串中的函数,它看起来像这样:

func_str = "def <func_name> ..."

我正在使用“exec”评估它并将其用于输入,如下所示:

exec func_str in locals()
locals()[func_name](inp)

现在这个函数可能会出现异常,我想知道字符串中是哪一行导致的。在解释器中运行它会给我一条错误消息,这正是我想要的:

  File "<string>", line 6, in <func_name>
TypeError: can only concatenate tuple (not "int") to tuple

这告诉我字符串中的第 6 行导致了问题。

是否有某种方式以编程方式捕获此信息?我看过类似的解决方案,但它们没有解决来自在本地范围内执行的字符串的异常。当尝试使用回溯模块时,我只得到了调用 exec 的外部函数的行号。

谢谢

最佳答案

好吧,这感觉又脏又恶心,但是给你吧。

sys.exc_info()[2].tb_next.tb_lineno + frameinfo.lineno

Lineno 必须直接位于要评估的字符串化代码上方,或者如果代码在脚本开头开始 - 显然没有必要。

import sys
from inspect import currentframe, getframeinfo

frameinfo = getframeinfo(currentframe())
func_str = """
def func_name(param):
d = []
u = 1
pass
a = ''
pass
print a + param
print "hi"
print "ho"
"""
exec func_str in locals()
inp = 1
try:
locals()["func_name"](inp)
except Exception as e:
print "Fails at:", sys.exc_info()[2].tb_next.tb_lineno + frameinfo.lineno
print "Inside:", len(func_str.split("\n")) - frameinfo.lineno

输出

Fails at: 12
Inside: 7

如果您只想为这个字符串化源使用“lineno”,那么

len(func_str.split("\n") - frameinfo.lineno

我不知道这个架构是你自己决定的还是被迫的,但我感到很抱歉:)

编辑:

如果您远程接收字符串

import sys
from inspect import currentframe, getframeinfo


some_item = "frameinfo = getframeinfo(currentframe())"

pass
random_items_here = 1

func_str = """
line_no = 2
lineno = 3
a_number = 0
def func_name(param):
d = []
u = 1
pass
a = ''
pass
print a + param
print "hi"
print "ho"
"""
exec some_item + "\n" + func_str in locals()
inp = 1
try:
locals()["func_name"](inp)
except Exception as e:
print "Fails at:", sys.exc_info()[2].tb_lineno
print "Inside:", len(func_str.split("\n")) - 2 - frameinfo.lineno

输出:

Fails at: 27
Inside: 11

但这似乎在末尾的新行过多时失败了(所以你至少需要 strip() func_str)

关于exec 中字符串的 python 回溯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35564208/

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