gpt4 book ai didi

python - Python 程序的跟踪表

转载 作者:太空狗 更新时间:2023-10-29 21:33:02 26 4
gpt4 key购买 nike

有没有办法获取 Python 程序的跟踪表?或者让一个程序运行另一个程序并获取它的跟踪表?我是一名教师,试图完美地验证我们在测试中使用的追踪问题的答案。

因此,例如,假设我有一个名为 problem1.py 的 Python 程序,其内容如下:

问题1.py

 a = 1
b = 2

a = a + b

执行假定的程序 traceTable.py 应该如下:

 $ python traceTable.py problem1.py
L || a | b
1 || 1 |
2 || 1 | 2
4 || 3 | 2

(或具有不同语法的相同信息)

我查看了 trace 模块,但我看不到它支持这一点的方法。


已更新

女士们先生们:根据 Ned Batchelder 的出色建议,我为您提供 traceTable.py!

嗯..差不多。正如您在 Ned Batchelder 的示例中看到的那样,frame.f_lineno 的行为并不总是很直观(例如,第 3 行和第 4 行都算作第 4 行),但行号足够接近,可以提供相当不错的效果引用。另外,所有的计算都是正确的。

我已经用一个包含 if 语句的长程序对此进行了测试,它给出了正确的表格(没有行号)。

您还会注意到,我的程序比 Ned Batchelder 的概念证明要长得多,因为他提到的大型程序中考虑了“更有趣的数据生态系统”。在使用 execfile 以及管理它和减少噪音(ala ignored_variables)以及生成正确的字符串输出所需的所有变量的范围内,需要更多的代码:

跟踪表.py
 '''
Usage: python traceTable.py program

-program Python program to be traced
'''

import sys

if len(sys.argv) < 2:
print __doc__
exit()
else:
file_name = sys.argv[1]

past_locals = {}
variable_list = []
table_content = ""

ignored_variables = set([
'file_name',
'trace',
'sys',
'past_locals',
'variable_list',
'table_content',
'getattr',
'name',
'self',
'object',
'consumed',
'data',
'ignored_variables'])

def trace(frame, event, arg_unused):
global past_locals, variable_list, table_content, ignored_variables
relevant_locals = {}
all_locals = frame.f_locals.copy()
for k,v in all_locals.items():
if not k.startswith("__") and k not in ignored_variables:
relevant_locals[k] = v
if len(relevant_locals) > 0 and past_locals != relevant_locals:
for i in relevant_locals:
if i not in past_locals:
variable_list.append(i)
table_content += str(frame.f_lineno) + " || "
for variable in variable_list:
table_content += str(relevant_locals[variable]) + " | "
table_content = table_content[:-2]
table_content += '\n'
past_locals = relevant_locals
return trace

sys.settrace(trace)

execfile(file_name)

table_header = "L || "
for variable in variable_list:
table_header += variable + ' | '
table_header = table_header[:-2]
print table_header
print table_content

调用时产生输出

 $ python traceTable.py problem1.py
L || a | b
2 || 1
4 || 1 | 2
4 || 3 | 2

最佳答案

这不是当前 Python 跟踪工具支持的用例,但应该可以构建。我不知道你如何决定输出哪些列。在您的样本中,a 和 b 是唯一的局部变量,但更大的程序会有更有趣的数据生态系统。

更新:这是一个简单的概念证明:

 1     import sys
2
3 def trace(frame, event, arg_unused):
4 print event, frame.f_lineno, frame.f_locals
5 return trace
6
7 sys.settrace(trace)
8
9 def foo():
10 a = 1
11 b = 2
12
13 a = a + b
14
15 foo()

运行时,输出为:

call 9 {}
line 10 {}
line 11 {'a': 1}
line 13 {'a': 1, 'b': 2}
return 13 {'a': 3, 'b': 2}

关于python - Python 程序的跟踪表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1645028/

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